网站首页 > 技术文章 正文
- 一、文档存储的需求
- 二、建立数据表
- 三、数据入库
- 四、查询数据
- 五、总结
一、文档存储的需求
很多的开发者都使用过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。
猜你喜欢
- 2024-09-11 浅析MySQL Join Reorder算法(mysqlinner join)
- 2024-09-11 js 小函数(js函数总结)
- 2024-09-11 Kubernetes 高性能网络组件 Calico 入门教程
- 2024-09-11 jQuery中的clone妙用(jquery.on)
- 2024-09-11 自定义一个"骚气"的jQuery
- 2024-09-11 前端单元测试以及自动化构建入门(前端单元测试是什么)
- 2024-09-11 Python全栈 Web(jQuery 一条龙服务)
- 2024-09-11 jQuery遍历说、详解与示例的结合,轻松搞定这个遍历!
- 2024-09-11 jQuery实现简易购物车功能(jquery购物车结算页面)
- 2024-09-11 jQuery核心的3个面试问题(jquery前端面试)
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)