ClickHouse的初步认识与使用
Posted 信小呆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.
以上是关于ClickHouse的初步认识与使用的主要内容,如果未能解决你的问题,请参考以下文章