ClickHouse的初步认识与使用

对于ck来说,虽然他有10的节点,但是比并不用把他想成一个集群,对于每个分片来说,他并不知道和其他分片的关系,就算是备份也是ck的一个流程通过zk做了一下备份。分布式表和本地表大概的意思就是一个1对多的关系,这个关系映射就是一个cluster。

表引擎的作用

 

可以看出clickhouse是基于各种引擎实现操作的,可以理解为等级制度,比如校长管着老师,老师管着学生,老师和学生在不同的班级,班级是分片,座位是副本,年级是同类型的表,要找一个学生肯定是去对应班级找,如果学生不在座位还在也算找到了,当然可以通过老师找,也可以通过校长找,可以指定班级年级,让老师去找,校长是分布式表,也可以直接通过李老师找,老师不能找其他班级的同学,所以他是非分布式的,但是每个老师的找学生的方法是不一样的,可对应表引擎也是不一样的。

 

注意:

  • 由于搭建的是Clickhouse集群环境,建表时需要在集群节点上创建一个Distributed的表,在每个分片节点创建MergeTree的表。在数据导入和查询时直接操作Distributed表,Distributed表会自动路由到相应的MergeTree表。
  • Hive中的数据类型,在Clickhouse中都有对应的类型名称:比如bigint -> Int64, int -> Int32, float -> Float32,需要按照Clickhouse的类型定义各个字段。
  • Clickhouse的字段默认是不允许为NULL的,如果数据有可能为NULL,需要将字段定义为类似Nullable(Int64)的类型。
  • 创建MergeTree表,需要设置分区字段和排序字段,排序字段一般会选择将经常聚合的维度排在前面,如果不清楚常用查询场景的话,和分区字段一致就可以了。
  • 创建Distributed表,不需要分区字段和排序字段,但要注意在Clickhouse的集群节点创建,不要在分片节点创建。

因此这次我们的建表语句如下所示,执行后显示OK。

  • 创建Distributed表,在10.128.184.59:8000集群节点:

CREATE TABLE t ( platform_id Nullable(Int32), channel_id Nullable(Int64), ... bidding_strategy Nullable(Int32), landing_page_type Nullable(Int32), region_id Nullable(Int16), dt String ) ENGINE = Distributed(ad_test_cluster, ad_test, t, rand())
  • 创建MergeTree表,在10.128.184.55:9000, 10.128.184.59:9000和10.128.184.59:9000三个分片节点:
CREATE TABLE t ( platform_id Nullable(Int32), channel_id Nullable(Int64), ... bidding_strategy Nullable(Int32), landing_page_type Nullable(Int32), region_id Nullable(Int16), dt String ) ENGINE = MergeTree PARTITION BY dt ORDER BY dt SETTINGS index_granularity = 8192

2. Clickhouse的数据导入

建表之后开始向表中导入数据,这里我们采用的是将csv文件直接导入的方式,这里有一些值得注意的细节:

  • 如果表的字段是Nullable的话,在csv文件中,对应列的值应该为\N,否则将无法导入。
  • 由于将csv文件导入,执行的是INSERT语句,因此在导入前需要先Drop相应的分区,保证数据不会重复导入。但是Drop的操作需要直接在分片节点操作,因此需要找到分片节点。可以在每个分片节点的system.parts表中,查看该分片上包含哪些分区,如果存在的话则可以进行Drop操作。

以下是数据导入的过程执行的命令:

# 将csv中的NULL替换为\N sed -i "s/NULL/\\\N/g" data.csv # drop分区已有的数据(需要找到对应的分片节点)

clickhouse-client -h 10.128.184.59 --port 9000 -d ad_test -u ad_test --password adxxx --query="alter table t drop partition('2019-10-01')" # 导入数据到Clickhouse中 cat data.csv | clickhouse-client -h 10.128.184.59 --port 8000 -d ad_test -u ad_test --password adxxx --format_csv_delimiter="|" --query="insert into t format CSV"

3. Clickhouse的查询语法

Clickhouse支持标准的SQL语法,在实测中没有遇到太多的问题。

目前只有一种情况是需要注意的:

  • 聚合指标不能同时出现在两个select字段中:

 

SELECT sum(charged_fees) AS charged_fees, sum(conversion_count) AS conversion_count, (sum(charged_fees) / sum(conversion_count)) / 100000 AS conversion_cost FROM t WHERE dt = '2019-07-01' Received exception from server (version 19.1.9): Code: 184. DB::Exception: Received from 10.128.184.59:9000. DB::Exception: Aggregate function sum(charged_fees) is found inside another aggregate function in query. 0 rows in set. Elapsed: 0.041 sec.

针对这种情况,把SQL改写为以下形式即可:

SELECT sum(charged_fees) AS charged_fees, sum(conversion_count) AS conversion_count, (charged_fees / conversion_count) / 100000 AS conversion_cost FROM t WHERE dt = '2019-07-01' ┌──charged_fees─┬─conversion_count─┬────conversion_cost─┐ │ 3143142724482 │ 250537 │ 150.37090954370022 │ └───────────────┴──────────────────┴────────────────────┘ (虚假数据,可能不准确) 1 rows in set. Elapsed: 0.155 sec. Processed 32.56 million rows, 1.20 GB (210.00 million rows/s.

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值