最近在用clickhouse,用spark对数据分析完批量导入clickhouse之后发现数据被插入了很多遍,查找了很多资料,发现问题:
1、表引擎应该采用ReplacingMergeTree
2、需要手动进行merge,执行语句
optimize table replacing_test;
- ReplacingMergeTree介绍
- 数据去重原理
ReplacingMergeTree通过ORDER BY,表示判断唯一约束的条件。当分区合并之时,根据ORDER BY排序后,相邻重复的数据会被排除。
由此,可以得出几点结论:
第一,使用ORDER BY作为特殊判断标识,而不是PRIMARY KEY。关于这一点网上有一些误传,但是如果理解了ORDER BY与PRIMARY KEY的作用,以及合并逻辑之后,都能够推理出应该是由ORDER BY决定。
ORDER BY的作用, 负责分区内数据排序;
PRIMARY KEY的作用, 负责一级索引生成;
Merge的逻辑, 分区内数据排序后,找到相邻的数据,做特殊处理。
第二,只有在触发合并之后,才能触发特殊逻辑。以去重为例,在没有合并的时候,还是会出现重复数据。
第三,只对同一分区内的数据有效。以去重为例,只有属于相同分区的数据才能去重,跨越不同分区的重复数据不能去重。
参考文档
https://blog.csdn.net/java_zhangshuai/article/details/103567816
https://cloud.tencent.com/developer/article/1604965