更新clickhouse中的数据

snz8szmq  于 2021-07-15  发布在  ClickHouse
关注(0)|答案(5)|浏览(1667)

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

dvtswwa3

dvtswwa31#

clickhouse不支持真正的更新/删除。但几乎没有可行的解决办法:
试图以一种不需要更新的方式组织数据。您可以将更新事件日志写入表,然后根据该日志计算报告。因此,不更新现有记录,而是将新记录追加到表中。
使用在合并期间在后台进行数据转换的表引擎。例如,(相当具体)CollasingMergeTree表引擎: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)缺点是,您不知道什么时候会进行后台合并,也不知道是否会进行后台合并。
再看看桑多吉的答案。

ie3xauqp

ie3xauqp2#

通过clickhouse中的alterquery,我们可以删除/更新表中的行。
对于delete:查询应构造为

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

对于更新:查询应构造为

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

vhmi4jdf3#

您可以删除和创建新表,但根据表的大小,这可能非常耗时。你可以这样做:
对于删除,类似的东西可以工作。

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

类似地,要更新一行,可以先用这种方式删除它,然后再添加它。

sh7euo9m

sh7euo9m4#

在最近的clickhouse版本中增加了更新或删除数据的功能,但是其昂贵的批处理操作不能太频繁地执行。
看到了吗https://clickhouse.yandex/docs/en/query_language/alter/#mutations 更多细节。

i5desfxk

i5desfxk5#

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

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

clickhouse更新文档

相关问题