如何避免ClickHouse表中的重复数据?

13

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

我只是重复一下其他人在答案中写的:当插入与之前相同的数据块时,任何Replicated{_/Summing/..}MergeTree引擎都提供了去重功能。通过添加额外的列,包括supports_deduplication,扩展了system.table_engines的输出格式- https://github.com/ClickHouse/ClickHouse/pull/8830 - 这有助于调查所有引擎及其关键能力。 - vladimir
FYI:有一个PR(https://github.com/ClickHouse/ClickHouse/pull/8467)支持MergeTree表上的去重。希望很快就能用了。 - vladimir
2个回答

11

如果重复的记录有重复的主键,那么最可能需要使用的是ReplacingMergeTree。当遇到重复记录时,您还可以尝试其他MergeTree引擎以进行更多操作。在执行查询时,可以使用FINAL关键字确保唯一性。


7
如果原始数据不包含重复项,但它们可能仅在INSERT INTO的重试期间出现,则ReplicatedMergeTree中有去重功能。为使其起作用,您应该重试插入完全相同的数据批次(相同顺序的相同行集)。您可以为这些重试使用不同的副本,因为块哈希通过ZooKeeper在副本之间共享,所以数据块仍将只被插入一次。
否则,在将数据插入ClickHouse之前,您应该从外部进行去重,或者使用ReplacingMergeTree或ReplicatedReplacingMergeTree异步清除重复项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接