【问题标题】:How to avoid duplicates in clickhouse table?如何避免clickhouse表中的重复?
【发布时间】:2023-03-08 12:33:01
【问题描述】:

我已创建表并尝试多次插入值以检查重复项。我可以看到重复插入。有没有办法避免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 引擎都会提供重复数据删除.它通过添加额外的列来扩展 system.table_engines 的输出格式,包括 supports_deduplication - github.com/ClickHouse/ClickHouse/pull/8830 - 它有助于调查所有引擎及其关键能力。跨度>
  • 仅供参考:有 PR (github.com/ClickHouse/ClickHouse/pull/8467) 支持 MergeTree 表上的重复数据删除。希望尽快推出。

标签: clickhouse


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-11-13
      • 2017-05-19
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-07
      • 1970-01-01
      相关资源
      最近更新 更多