spark数据写入clickhouse mergeTree引擎 数据重复问题

本文介绍了在使用ClickHouse时遇到的数据重复问题及其解决方案。通过采用ReplacingMergeTree表引擎,并结合手动执行optimize table命令进行分区合并,可以实现数据去重。ReplacingMergeTree依赖于ORDERBY字段进行去重,而非PRIMARYKEY,且该方法仅对同一分区内的数据有效。去重逻辑在数据合并后触发,确保重复数据在分区内部被消除。
摘要由CSDN通过智能技术生成

最近在用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值