如何避免clickhouse表中的重复项?

iswrvxsc  于 2021-07-15  发布在  ClickHouse
关注(0)|答案(2)|浏览(682)

我已经创建了表并尝试多次插入值来检查重复项。我可以看到复制品正在插入。有没有办法避免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 │
└────┴────────────┘

* /
siv3szwd

siv3szwd1#

最有可能 ReplacingMergeTree 只要复制记录复制主键,就是您所需要的。你也可以试试其他的 MergeTree 引擎在遇到复制记录时执行更多操作。 FINAL 关键字可以在执行查询时使用,以确保唯一性。

bvk5enib

bvk5enib2#

如果原始数据不包含重复数据,并且它们可能仅在重试插入时出现,则replicatedmergetree中有一个重复数据消除功能。要使其正常工作,您应该重新插入完全相同的数据批(以相同顺序插入相同的行集)。您可以为这些重试使用不同的副本,并且数据块仍将仅插入一次,因为通过zookeeper在副本之间共享块哈希。
否则,您应该在插入clickhouse之前从外部消除重复数据,或者使用replacingmergetree或replicatedreplacingmergetree异步清除重复数据。

相关问题