一、 引入相关依赖
<!--clickhouse-->
<dependency>
<groupId>com.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>0.3.2-patch8</version>
</dependency>
<!--多数据源-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
二、 配置文件
spring:
datasource:
click_house:
user: user
password: password
driver-class-name: ru.yandex.clickhouse.ClickHouseDriver
url: jdbc:clickhouse://ip:port/库名
三、 数据库语句注意事项
CREATE 两种方式
1、创建表时直接同步数据
CREATE TABLE 表名 ENGINE = ReplacingMergeTree ORDER BY id AS
SELECT * FROM mysql(数据库连接路径, 库名,表名, 帐号, 密码);
注意:这种创建会复制原表的数据库结构及数据,但当原表字段允许为空时,新表的字段会默认为Nullable,当代码中获取数据结果规范类型时,会报类型转换错误。
注意:这种创建可以添加分片字段,当原表中该字段允许为空时,创建语句会报错,参与Order by 的字段,也会报错
2、单独创建表
CREATE TABLE 表名(
`Integer` UInt32,
`Long` UInt64,
`Decimal` Decimal(20,4),
`DateTime` DateTime,
`String` String,
`create_time` DateTime DEFAULT now(),
`update_time` DateTime DEFAULT now()
)ENGINE = ReplacingMergeTree
PARTITION BY toYYYYMM(update_time)
PRIMARY KEY id
ORDER BY (id,content_id,order_id)
注意:这种创建方式不会同步原表数据,可以先用同步方式创建,然后将创建后的表当做数据源,再同步到单独创建表中
创建表时,注意设置引擎及分区字段,排序字段,ClickHouse支持PARTITION BY子句,在建表时可以指定按照任意合法表达式进行数据分区操作,比如通过toYYYYMM()将数据按月进行分区、toMonday()将数据按照周几进行分区
Order by 数据字段不仅会被用来当作排序字段,还会被用来当作用于去重的依据,执行optimize手动触发合并 OPTIMIZE TABLE table_name final
INSERT
1、单条插入
INSERT INTO 表名 (*) VALUES (1, 'a', 1) ;
2、批量插入
INSERT INTO 表名 [(列名1, 列名2, 列名3)] FORMAT Values (v11, v12, v13), (v21, v22, v23)
注意:批量新增时与MYSQL 不同,一定要加FORMAT 否则会抛出空值异常
四、 分区操作指令
DETACH PARTITION - 将分区移动到detached目录并忘记它。
DROP PARTITION — 删除分区。
ATTACH PART|PARTITION — 将detached目录中的数据块或分区添加到表中。
ATTACH PARTITION FROM — 将数据分区从一个表复制到另一个表并添加。
REPLACE PARTITION — 将数据分区从一个表复制到另一个表并替换。
MOVE PARTITION TO TABLE — 将数据分区从一个表移动到另一个表。
CLEAR COLUMN IN PARTITION — 重置分区中指定列的值。
CLEAR INDEX IN PARTITION — 重置分区中指定的二级索引。
FREEZE PARTITION — 创建分区的备份。
UNFREEZE PARTITION — 删除分区的备份。
FETCH PARTITION|PART — 从另一台服务器下载数据块或分区。
MOVE PARTITION|PART — 将分区/数据块移动到另一个磁盘或卷。
UPDATE IN PARTITION — 按条件更新分区内的数据。
DELETE IN PARTITION — 按条件删除分区内的数据。
五、 数据同步
新版clickhouse提供了一个实验性的功能,可以将clickhouse伪装成mysql的一个备库去实时对齐mysql中的数据,当mysql库表数据发生变化时会实时同步到clickhouse中;这样就省掉了单独维护实时spark/flink任务读取kafka数据再存入clickhouse的环节,大大降低了运维成本提升了效率。
CREATE DATABASE ckdb ENGINE = MaterializeMySQL('IP:端口', '数据库', '帐号', '密码');