使用spark,多线程写入clickhouse
第一次建表时设置ENGINE = MergeTree,PARTITION BY和ORDER BY字段相同。
最终表中的数据发生重复。
CREATE TABLE dev.test_risk_full ( ) ENGINE = MergeTree PARTITION BY ORGCD ORDER BY ID SETTINGS index_granularity = 8192;
第二次建表时,设置如下,发现虽然无重复数据,但是数据插入速度下降明显
CREATE TABLE dev.test_risk_full ( ) ENGINE = ReplaceMergeTree PRIMARY KEY ID PARTITION BY ORGCD2 ORDER BY ID SETTINGS index_granularity = 8192;
查看资料后,了解到
PRIMARY KEY指定的字段是用来创建一级索引,不具有唯一约束性;
PARTITION BY指定的字段是用来进行分区;
ORDER BY指定的字段是对分区内数据进行排序,在ReplaceMergeTree引擎下,会对相邻的重复数据进行删除
ClickHouse MergeTree的分区目录和其他数据库有所不同。MergeTree的分区目录不是在数据表被创建时生成,而是伴随着每一次的数据写入(INSERT INTO)都会生成一份分区目录。在数据导入完成后,ClickHouse通过后台任务将属于相同分区的多个目录合并成一个新的目录。已经存在的旧分区目录不会立即删除,而是在之后的某个时刻通过后台任务被删除(默认设置是8分钟)。
之前用的Hive、Hbase数据库在建表时会定义好分区目录,每次写入的数据会依据分区字段追加到不同的分区中。
暂时没研究明白导致数据重复的原因…
参考资料:
spark数据写入clickhouse mergeTree引擎 数据重复问题
https://blog.csdn.net/subian1261/article/details/115691273
clickhouse分区目录的合并过程原理
https://blog.csdn.net/u011110301/article/details/116600323
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)