很多的开发者都使用过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的数组的下标是从1开始的,这与我们传统编程开发中的规范是不一致的。


# 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





Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐