关于java:clickhouse专栏对标mongodb存储类JSON数据文档统计分析

23次阅读

共计 2083 个字符,预计需要花费 6 分钟才能阅读完成。

一、文档存储的需要

很多的开发者都应用过 mongodb,在 mongodb 中数据记录是以文档的模式存在的(相似于一种多级嵌套 SQL 的模式)。比方上面的 JSON 数据结构:dev_ip 示意某一台服务器的 ip、location 字段寄存经纬度、meminfo.total 和 meminfo.userd 别离代表内存总量和使用量。

[{
  "dev_ip": "123.46.5.111",
  "location": [39.916527, 116.397128],
  "meminfo": {
    "total": 64,
    "used": 23.2
  }
},
{
  "dev_ip": "123.46.5.112",
  "location": [39.916144, 116.392582],
  "meminfo": {
    "total": 64,
    "used": 27.8
  }
}]

二、建表

存储文档须要应用到 Map 这种数据类型,在某些比拟旧的版本中,Map 数据类型还是实验性的,不能间接应用。如果想应用,须要执行 set allow_experimental_map_type = 1;
而后咱们能够依照 JSON 的数据结构来建表,location 是数组 Array 数据类型,meminfo 是 Map 数据类型。

CREATE TABLE dev_meminfo (
  dev_ip String,  
  location Array(Float64),
  meminfo Map(String, Float32)
)
ENGINE = MergeTree()
ORDER BY dev_ip;

clickhouse 提供了数组类型 Array(T),数组类型由多个 T 元素组成。T 能够是任意的根底数据类型,或者也能够是数组类型。如果是数组类型就造成了多维数组,Cickhouse 对多维数组的反对无限,所以不倡议应用多维数组。数组外面所有的 T 元素的数据类型必须是一样的,否则会抛出异样。

三、数据入库

在 linux 环境下,咱们能够将 JSON 数据保留为一个文档,命名如:dev_meminfo.json。而后应用上面的命令行,实现文档 JSON 数据的入库。jq的作用是将 JSON 数组及 Map 从构造中剥离进去,从而合乎 JSONEachRow 要求的输出格局。

cat dev_meminfo.json |jq -c .[] | clickhouse-client --database acaidb -m -u acai --password '< 你的明码 >'  \
--query="INSERT INTO dev_meminfo FORMAT JSONEachRow"

或者咱们能够间接应用 INSERT 语句来实现数据的单条插入,如下:

INSERT  INTO dev_meminfo FORMAT JSONEachRow {"dev_ip": "123.46.5.112", "location": [39.916144, 116.392582],"meminfo": {"total": 64,"used": 27.8}};

四、查问数据

select * 的形式查问数据:

#  clickhouse-client --database acaidb -m -u acai --password '4rfv$RFV'  --query="SELECT * FROM dev_meminfo"
123.46.5.111    [39.916527,116.397128]  {'total':64,'used':23.2}
123.46.5.112    [39.916144,116.392582]  {'total':64,'used':27.8}

应用字段名称形式查问数据,须要留神的是 Ciickhouse 的数组的下标是从 0 开始的,这与咱们传统编程开发中的标准是不统一的。

# clickhouse-client --database acaidb -m -u acai --password '4rfv$RFV'  --query="SELECT dev_ip,location[1],location[2],meminfo['total'],meminfo['used'] FROM dev_meminfo"
123.46.5.111    39.916527       116.397128      64      23.2
123.46.5.112    39.916144       116.392582      64      27.8

五、总结

咱们看到 clickhouse 能够代替 mongodb 进行类 JSON 文档数据的存储,而且反对 SQL 查问统计分析,这一点是比拟吸引人的。我只是介绍了简略的查问,其实针对各种统计分析场景,clickhouse 提供了超级多的统计分析函数、窗口函数等等,当然针对数组的数据类型也有很多的统计分析函数。
更为值得注意的是:笔者看到一些测评文章,clickhouse 的的统计分析性能是 mongodb 的近百倍之多(笔者本人尚未验证,请关注我的专栏后续文章)。然而也不是说 clickhouse 能够代替 mongodb 的所有利用场景,至多面向用户的并发申请的场景 clickhouse 是不满足的,因为 clickhouse 的定位是数据仓库,次要是面向数据分析 OLAP 场景,而不是面向用户高并发的联机事务处理 OLTP。

举荐浏览

《clickhouse 专栏》

正文完
 0