【问题标题】:Updating data in Clickhouse在 Clickhouse 中更新数据
【发布时间】:2016-10-20 11:26:22
【问题描述】:

我查看了 Clickhouse 的文档,但没有看到 UPDATE 或 DELETE 选项。在我看来,它是一个仅附加的系统。 是否有可能更新现有记录,或者是否有一些解决方法,例如截断其中记录已更改的分区,然后重新插入该分区的整个数据?

【问题讨论】:

    标签: database clickhouse


    【解决方案1】:

    您可以删除和创建新表,但根据它们的大小,这可能会非常耗时。你可以这样做:

    对于删除,类似这样的方法可以工作。

      INSERT INTO tableTemp SELECT * from table1 WHERE  rowID != @targetRowID;
        DROP table1;
        INSERT INTO table1 SELECT * from tableTemp;
    

    同样,要更新一行,可以先用这种方式删除,然后再添加。

    【讨论】:

    • 但是我将如何更新一个非常大的表。例如,如果我的流程要收集大量记录,然后“正确”其中的 15%,该怎么办?
    • 基本上只是更新和删除多行?您可以先将这些行选择到临时表中,然后将 where 子句更改为 WHERE rowID is not in (SELECT rowID FROM targetTable) 您在这里只受您可以选择的内容的限制。
    • 重命名表比INSERT INTO table1 SELECT * from tableTemp;更有效
    【解决方案2】:

    ClickHouse 不支持真正的 UPDATE/DELETE。 但可能的解决方法很少:

    1. 尝试以不需要更新的方式组织数据。 您可以将更新事件日志写入表,然后从该日志计算报告。因此,您无需更新现有记录,而是将新记录附加到表中。

    2. 在合并期间使用在后台进行数据转换的表引擎。例如,(相当具体的)CollapsingMergeTree 表引擎: https://clickhouse.yandex/reference_en.html#CollapsingMergeTree 还有 ReplacingMergeTree 表引擎(尚未记录,您可以在测试中找到示例:https://github.com/yandex/ClickHouse/blob/master/dbms/tests/queries/0_stateless/00325_replacing_merge_tree.sql) 缺点是你不知道什么时候会完成后台合并,以及是否会完成。

    也看看 samdoj 的回答。

    【讨论】:

    【解决方案3】:

    在最近的 ClickHouse 版本中添加了更新或删除数据的功能,但它的批量操作成本很高,不能太频繁地执行。

    更多详情请见https://clickhouse.yandex/docs/en/query_language/alter/#mutations

    【讨论】:

      【解决方案4】:

      通过 clickhouse 中的 Alter 查询,我们可以删除/更新表中的行。

      对于删除:查询应构造为

      ALTER TABLE testing.Employee DELETE  WHERE  Emp_Name='user4';
      

      对于更新:查询应构造为

      ALTER TABLE testing.employee UPDATE AssignedUser='sunil' where AssignedUser='sunny';
      

      【讨论】:

        【解决方案5】:

        这是一个老问题,但 Clickhouse 现在支持更新。请注意,出于性能原因,不建议进行许多小的更改。但这是可能的。

        语法:

        ALTER TABLE [db.]table UPDATE column1 = expr1 [, ...] WHERE filter_expr
        

        Clickhouse UPDATE documentation

        【讨论】:

          猜你喜欢
          • 2020-10-02
          • 2019-04-17
          • 2020-08-05
          • 2023-02-01
          • 2020-05-01
          • 2016-10-23
          • 2019-01-08
          • 2020-08-10
          • 1970-01-01
          相关资源
          最近更新 更多