如何避免clickhouse表中的重复?

use*_*468 6 clickhouse

我创建了表并尝试多次插入值以检查重复项。我可以看到重复项正在插入。有没有办法避免clickhouse表中的重复?

CREATE TABLE sample.tmp_api_logs ( id UInt32,  EventDate Date) 
ENGINE = MergeTree(EventDate, id, (EventDate,id), 8192);

insert into sample.tmp_api_logs values(1,'2018-11-23'),(2,'2018-11-23');
insert into sample.tmp_api_logs values(1,'2018-11-23'),(2,'2018-11-23');

select * from sample.tmp_api_logs;
/*
??id????EventDate??
?  1 ? 2018-11-23 ?
?  2 ? 2018-11-23 ?
???????????????????
??id????EventDate??
?  1 ? 2018-11-23 ?
?  2 ? 2018-11-23 ?
???????????????????
*/
Run Code Online (Sandbox Code Playgroud)

Iva*_*kov 7

如果原始数据不包含重复项,并且它们可能仅在重试 INSERT INTO 期间出现,则Replicated MergeTree中有重复数据删除功能。为了使其工作,您应该重试插入完全相同批次的数据(同一顺序的同一组行)。您可以使用不同的副本进行这些重试,并且数据块仍将仅插入一次,因为块哈希通过 ZooKeeper 在副本之间共享。

否则,您应该在插入 ClickHouse 之前从外部删除重复数据,或者使用ReplacingMergeTree 或 ReplicatedReplacingMergeTree异步清理重复数据。


Amo*_*mos 6

ReplacingMergeTree只要重复记录重复主键,很可能就是您所需要的。MergeTree当遇到复制记录时,您还可以尝试其他引擎以进行更多操作。FINAL查询时可以使用关键字来确保唯一性。