我查看了 Clickhouse 的文档,但没有看到 UPDATE 或 DELETE 选项。在我看来,它只是一个附加系统。是否有可能更新现有记录,或者是否有一些解决方法,例如截断其中记录已更改的分区,然后重新插入该分区的整个数据?
5 回答
更新:这个答案不再正确,请查看https://stackoverflow.com/a/55298764/3583139
ClickHouse 不支持真正的 UPDATE/DELETE。但是有几个可能的解决方法:
试图以不需要更新的方式组织数据。您可以将更新事件日志写入表,然后从该日志计算报告。因此,您无需更新现有记录,而是将新记录附加到表中。
使用在合并期间在后台进行数据转换的表引擎。例如,(相当具体的)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 的答案。
通过 clickhouse 中的 Alter 查询,我们可以删除/更新表中的行。
对于删除:查询应构造为
ALTER TABLE testing.Employee DELETE WHERE Emp_Name='user4';
对于更新:查询应构造为
ALTER TABLE testing.employee UPDATE AssignedUser='sunil' where AssignedUser='sunny';
您可以删除并创建新表,但根据它们的大小,这可能非常耗时。你可以这样做:
对于删除,这样的事情可能会起作用。
INSERT INTO tableTemp SELECT * from table1 WHERE rowID != @targetRowID;
DROP table1;
INSERT INTO table1 SELECT * from tableTemp;
同样,要更新一行,您可以先以这种方式删除它,然后再添加它。
最近的 ClickHouse 版本中添加了更新或删除数据的功能,但其昂贵的批处理操作不能太频繁地执行。
有关更多详细信息,请参阅https://clickhouse.yandex/docs/en/query_language/alter/#mutations。
这是一个老问题,但 Clickhouse 现在支持更新。请注意,出于性能原因,不建议进行许多小的更改。但这是可能的。
句法:
ALTER TABLE [db.]table UPDATE column1 = expr1 [, ...] WHERE filter_expr