13

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

4

5 回答 5

17

更新:这个答案不再正确,请查看https://stackoverflow.com/a/55298764/3583139

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 的答案。

于 2016-06-20T04:35:22.337 回答
16

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

对于删除:查询应构造为

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

对于更新:查询应构造为

ALTER TABLE testing.employee UPDATE AssignedUser='sunil' where AssignedUser='sunny';
于 2019-03-22T11:36:30.980 回答
5

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

对于删除,这样的事情可能会起作用。

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

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

于 2016-06-18T22:01:43.240 回答
3

最近的 ClickHouse 版本中添加了更新或删除数据的功能,但其昂贵的批处理操作不能太频繁地执行。

有关更多详细信息,请参阅https://clickhouse.yandex/docs/en/query_language/alter/#mutations

于 2018-11-22T18:37:09.980 回答
2

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

句法:

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

Clickhouse 更新文档

于 2020-10-27T17:23:12.127 回答