当前位置: 首页 > 后端技术 > Java

【clickhouse专栏】标准mongodb存储类JSON数据文档统计分析

时间:2023-04-02 01:14:31 Java

1.很多开发者都使用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数据类型仍处于试验阶段,不能直接使用。如果要使用,需要执行setallow_experimental_map_type=1;。那么我们就可以根据JSON数据结构建表,location是Array数据类型,meminfo是Map数据类型。CREATETABLEdev_meminfo(dev_ipString,locationArray(Float64),meminfoMap(String,Float32))ENGINE=MergeTree()ORDERBYdev_ip;clickhouse提供了数组类型Array(T),由多个T元素组成。T可以是任何基本数据类型,也可以是数组类型。如果是数组类型,则组成多维数组。Cickhouse对多维数组的支持有限,所以不推荐使用多维数组。数组中所有T元素的数据类型必须相同,否则会抛出异常。3、数据存储在linux环境下,我们可以将JSON数据保存为一个文件,命名如:dev_meminfo.json。然后使用如下命令行完成文档JSON数据的存储。jq的作用是将JSON数组和Map从结构中剥离出来,从而满足JSONEachRow要求的输入格式。catdev_meminfo.json|jq-c.[]|clickhouse-client--databaseaaidb-m-uacai--password''\--query="INSERTINTOdev_meminfoFORMATJSONEachRow"或者我们可以直接使用INSERT语句完成数据的单次插入,如如下:插入dev_meminfoFORMATJSONEachRow{"dev_ip":"123.46.5.112","location":[39.916144,116.392582],"meminfo":{"total":64,"used":27.8}};4.查询数据select*查询数据:#clickhouse-client--databaseaaidb-m-uacai--password'4rfv$RFV'--query="SELECT*FROMdev_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--databaseaaidb-m-uacai--password'4rfv$RFV'--query="SELECTdev_ip,location[1],location[2],meminfo['total'],meminfo['used']FROMdev_meminfo"123.46.5.11139.916527116.3971286423.2123.46.5.11239.916144116.3925826427.85.总结我们看到clickhouse可以替代mongodb来存储类JSON的文档数据,它支持SQL查询来吸引统计分析。这一点是人性的。我只是介绍了简单的查询。事实上,clickhouse针对各种统计分析场景,提供了很多统计分析函数、窗口函数等。当然,还有很多针对数组数据类型的统计分析函数。更值得一提的是:我看过一些测评文章,clickhouse的统计分析性能是mongodb的近百倍(本人没有验证过,请关注我专栏的后续文章)。但是不代表clickhouse可以替代mongodb的所有应用场景,至少clickhouse面向用户并发请求的场景是不满足的,因为clickhouse的定位是数据仓库,主要面向数据分析OLAP场景,不面向用户具有高并发的在线事务处理OLTP。推荐阅读《clickhouse专栏》