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