clickhouse是一个列式数据库(系统)。
官方文档
官网比较全,但也可以说比较杂,下面就是我个人的一些总结,以及在实际工作中的应用场景。
1.clickhouse适用场景
clickhouse主要适合那种大量数据做分析的场景。
一般数据insert进去,也就不要修改和删除了。
比如那种埋点的数据,每秒成百上千条插入,但对事务的要求不高。
clickhouse比较吃内存,这也是它比较快的原因之一。
我实际工作的场景,就是把每天几百万甚至几千万的业务数据,在各个维度把数据拉平,存在clickhouse中,所以存的是最细分的数据,然后作为统计报表的查询库,可以查出各个维度下或多个维度下的数据了。
2.clickhouse与mysql类比。
初学的时候,你可以把clickhouse类比mysql来用。
同样的都有数据库,都要创建表,都支持sql标准。
clickhouse的数据也是存在表中的,先建库,再建表,最后insert数据。
clickhouse默认有一个default库,建表的时候,数据类型的定义和mysql不一样,以及引擎也不一样。
clickhouse一般都用的是mergeTree引擎,我们后面也是以这个引擎为例。
3.clickhouse常用数据类型
clickhouse表中的每个字段,都必须在创建表的时候指定数据类型,常用的有以下几种:
1.整形
整型范围
Int8 - [-128 : 127]
Int16 - [-32768 : 32767]
Int32 - [-2147483648 : 2147483647]
Int64 - [-9223372036854775808 : 9223372036854775807]
无符号整型范围
UInt8 - [0 : 255]
UInt16 - [0 : 65535]
UInt32 - [0 : 4294967295]
UInt64 - [0 : 18446744073709551615]
常用UInt16
2.浮点型
Float32, Float64
我用的比较少
3.Decimal
涉及到钱等类似其他精细计算的类型
4.String
最常用的类型,万物皆String
5.Date
精确到天,对应java中,是long类型。
insert的时候注意单位
当表的引擎用mergeTree时,还必须要有个Date类型的字段。
6.DateTime
精确到秒,对应java中,也是long类型
insert的时候,也是注意单位
7.其他
官网还提供了其他类型,平时用不到,所以先不说了
5.clickhouse的引擎
clickhouse提供了很多引擎,我们注意说说mergeTree
mergeTree引擎,主要有个分区的特点。
我们可以指定按天分区,或者按月分区,那么后面查询或者删除的时候,就可以按天或按月。
建表规范如下
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],...INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1,INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2
) ENGINE = MergeTree()
[PARTITION BY expr]
[ORDER BY expr]
[PRIMARY KEY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]
重点看mergeTree()后面各个属性的定义顺序
删除数据(mergeTree引擎)
带分区的引擎,可以按分区删除。
以按天分区的表举例:
表名:response_event
不需要指定字段名,因为建表的时候已经指定了。
ALTER TABLE response_event DROP PARTITION '2019-11-11';
如果这个字段是null,就用 ‘0000-00-00’
4.实战—java中使用clickhouse
1.使用maven
<dependency><groupId>ru.yandex.clickhouse</groupId><artifactId>clickhouse-jdbc</artifactId><version>0.1.48</version></dependency>
2.JDBC连接数据库
ClickHouseProperties properties = new ClickHouseProperties();properties.setDataTransferTimeout(5 * 60 * 1000);properties.setMaxExecutionTime(5 * 60 * 1000);properties.setSocketTimeout(5 * 60 * 1000);ClickHouseDataSource dataSource = new ClickHouseDataSource("jdbc:clickhouse://clickhouse的ip:8123/default", properties);ClickHouseConnection connection = dataSource.getConnection();ClickHouseStatement statement = connection.createStatement();
3.创建表
CREATE TABLE response_event(requestId String,event UInt8,...eventTime DateTime,createDate Date)ENGINE = MergeTree PARTITION BY toDate(createDate) ORDER BY (createDate) SETTINGS index_granularity=8192;
boolean execute = statement.execute(sql);
4.插入数据
INSERT INTO response_event(requestId,event,...eventTime,createDate) values(.......)
boolean execute = statement.execute(sql);
5.查询数据
select count(1) from response_event;
select * from response_event;
ClickHouseResponse response = statement.executeQueryClickhouseResponse(sql);JSONObject res = JSONObject.parseObject(JSONObject.toJSONString(response));JSONArray data = res.getJSONArray("data");JSONArray meta = res.getJSONArray("meta");
5.clickhouse可视化软件
类似于mysql的navicat,clickhouse常用DBeaver来可视化
DBeaver官网下载,直接安装