【发布时间】:2016-10-20 11:26:22
【问题描述】:
我查看了 Clickhouse 的文档,但没有看到 UPDATE 或 DELETE 选项。在我看来,它是一个仅附加的系统。 是否有可能更新现有记录,或者是否有一些解决方法,例如截断其中记录已更改的分区,然后重新插入该分区的整个数据?
【问题讨论】:
标签: database clickhouse
我查看了 Clickhouse 的文档,但没有看到 UPDATE 或 DELETE 选项。在我看来,它是一个仅附加的系统。 是否有可能更新现有记录,或者是否有一些解决方法,例如截断其中记录已更改的分区,然后重新插入该分区的整个数据?
【问题讨论】:
标签: database clickhouse
您可以删除和创建新表,但根据它们的大小,这可能会非常耗时。你可以这样做:
对于删除,类似这样的方法可以工作。
INSERT INTO tableTemp SELECT * from table1 WHERE rowID != @targetRowID;
DROP table1;
INSERT INTO table1 SELECT * from tableTemp;
同样,要更新一行,可以先用这种方式删除,然后再添加。
【讨论】:
WHERE rowID is not in (SELECT rowID FROM targetTable) 您在这里只受您可以选择的内容的限制。
INSERT INTO table1 SELECT * from tableTemp;更有效
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 的回答。
【讨论】:
1.1.54388 发布 2018-06-28 你可以改变数据。 clickhouse.yandex/docs/en/changelog/…
在最近的 ClickHouse 版本中添加了更新或删除数据的功能,但它的批量操作成本很高,不能太频繁地执行。
更多详情请见https://clickhouse.yandex/docs/en/query_language/alter/#mutations。
【讨论】:
通过 clickhouse 中的 Alter 查询,我们可以删除/更新表中的行。
对于删除:查询应构造为
ALTER TABLE testing.Employee DELETE WHERE Emp_Name='user4';
对于更新:查询应构造为
ALTER TABLE testing.employee UPDATE AssignedUser='sunil' where AssignedUser='sunny';
【讨论】:
这是一个老问题,但 Clickhouse 现在支持更新。请注意,出于性能原因,不建议进行许多小的更改。但这是可能的。
语法:
ALTER TABLE [db.]table UPDATE column1 = expr1 [, ...] WHERE filter_expr
【讨论】: