【clickhouse专栏】对标mongodb存储类JSON数据文档统计分析
一、文档存储的需求
很多的开发者都使用过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。
推荐阅读
限于博文篇幅,更多精彩内容我就不一一列举了,推荐阅读
《原创精品视频及配套文档:springboot-已录制97节(免费)》
等等等等
【clickhouse专栏】对标mongodb存储类JSON数据文档统计分析的更多相关文章
- MongoDB 存储引擎和数据模型设计
标签: MongoDB NoSQL MongoDB 存储引擎和数据模型设计 1. 存储引擎 1.1 存储引擎是什么 1.2 MongoDB中的默认存储引擎 2. 数据模型设计 2.1 内嵌和引用 2. ...
- mongodb的基本操作与插入文档(document)
一.mongodb的基本操作: 1.查看mongodb当前所有的databases : show dbs 2.选择数据库(database) : use databaseName(该数据库不存在则会自 ...
- MongoDB数据库、集合、文档的操作
MongoDB系列第一课:MongDB简介 MongoDB系列第二课:MongDB环境搭建 MongoDB系列第三课:MongDB用户管理 MongoDB系列第四课:MongoDB数据库.集合.文档的 ...
- MongoDB入门教程一[文档与集合]
MongoDB 是面向集合存储的文档型数据库,其涉及到的基本概念与关系型数据库相比有所不同.举个例子,在关系型数据库中,我们记录一个订单的信息,通常是这样设计表结构的: 设计一个订单基本信息表和一个订 ...
- linux下,MySQL默认的数据文档存储目录为/var/lib/mysql。
0.说明 Linux下更改yum默认安装的mysql路径datadir. linux下,MySQL默认的数据文档存储目录为/var/lib/mysql. 假如要把MySQL目录移到/home/data ...
- IntelliJ idea鼠标移动到类上显示文档document(javadoc)内容
IntelliJ idea鼠标移动到类上显示文档document(javadoc)内容 Step 1:设置鼠标移动到类上自动显示Javadoc文档 step2:为jdk下载javadoc Step3: ...
- Java,面试题,简历,Linux,大数据,常用开发工具类,API文档,电子书,各种思维导图资源,百度网盘资源,BBS论坛系统 ERP管理系统 OA办公自动化管理系统 车辆管理系统 各种后台管理系统
Java,面试题,简历,Linux,大数据,常用开发工具类,API文档,电子书,各种思维导图资源,百度网盘资源BBS论坛系统 ERP管理系统 OA办公自动化管理系统 车辆管理系统 家庭理财系统 各种后 ...
- NoSQL生态系统——类似Bigtable列存储,或者Dynamo的key存储(kv存储如BDB,结构化存储如redis,文档存储如mongoDB)
摘自:http://www.ituring.com.cn/article/4002# NoSQL系统的数据操作接口应该是非SQL类型的.但在NoSQL社区,NoSQL被赋予了更具有包容性的含义,其意为 ...
- MongoDB增删改查表文档
MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写,是一个基于分布式文件存储的开源数据库系统.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关 ...
随机推荐
- Java报错:Injection of resource dependencies failed
在学习springMVC+Mabatis的时候,添加注解@Resource报错 Injection of resource dependencies failed de完bug后发现有几个点注意一下, ...
- Struts2中将表单数据封装到List和Map集合中
一.将表单数据封装到Map集合中 1.创建MapAction类 import cn.entity.User; import com.opensymphony.xwork2.ActionSupport; ...
- spring配置数据源(加载properties文件)
1.在spring中引入properties配置文件需要引入context的命名空间和真实地址 2.然后加载文件 需要注意的是这是采用的是set注入方式,所以name属性值必须是连接池set方法名去掉 ...
- QGIS 安装
QGIS 安装 官网 https://www.qgis.org/ 下载地址 https://www.qgis.org/en/site/forusers/download.html 参考文档 https ...
- linux centos 8.2 安装docker
1 使用yum -y install docker安装后启动docker提示Failed to start docker.service: Unit docker.service not found. ...
- 在Vue3项目中使用pinia代替Vuex进行数据存储
pinia是一个vue的状态存储库,你可以使用它来存储.共享一些跨组件或者页面的数据,使用起来和vuex非常类似.pina相对Vuex来说,更好的ts支持和代码自动补全功能.本篇随笔介绍pinia的基 ...
- JAVA语言学习day16--7月22日
###15用户选择功能 * A: 用户选择功能 * a: 案例代码 import java.util.ArrayList; import java.util.Scanner; /* * 超市管理系统主 ...
- Hyperledger Fabric 部署在多个主机上
前言 在实验Hyperledger Fabric无排序组织以Raft协议启动多个Orderer服务.TLS组织运行维护Orderer服务中,我们已经完成了使用提供 TLS-CA 服务的 council ...
- Emacs基础使用教程及常见命令整理
前言:最近使用Emacs,因此整理了官方中文教程中的一些知识点和常用的命令,方便查阅使用. 对于用习惯Windows的人来说,想要入门Emacs不是一件特别容易的事,但好在Emacs提供了官方的教程文 ...
- 忘记VMware vcenter的Administrator@vsphere.local密码
忘记VMware vcenter的Administrator@vsphere.local密码的解决办法一. 重置密码:ssh root@192.168.230.100Connecting to 192 ...