在Clickhouse中更新数据

Jon*_*han 10 database clickhouse

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

uYS*_*foz 15

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的回答.

  • 从“1.1.54388”版本 2018-06-28 开始,您可以更改数据。https://clickhouse.yandex/docs/en/changelog/#clickhouse-release-1-1-54388-2018-06-28 (3认同)

Sun*_*nny 10

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

对于删除:查询应构造为

ALTER TABLE testing.Employee DELETE  WHERE  Emp_Name='user4';
Run Code Online (Sandbox Code Playgroud)

对于更新:查询应构造为

ALTER TABLE testing.employee UPDATE AssignedUser='sunil' where AssignedUser='sunny';
Run Code Online (Sandbox Code Playgroud)


小智 5

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

删除,这样的东西可以工作.

  INSERT INTO tableTemp SELECT * from table1 WHERE  rowID != @targetRowID;
    DROP table1;
    INSERT INTO table1 SELECT * from tableTemp;
Run Code Online (Sandbox Code Playgroud)

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


Iva*_*kov 5

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

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