clickhouse有没有办法在写作时替换相同的密钥数据



ClickHouse在写入时,是否可以基于多个列作为Key,如果是重复的Key数据,则在替换现有数据时插入相同Key,以确保相同Key,只有一行数据。目前我知道解决方案是通过ReplaceMergeTree引擎来完成,但这种方式是一个异步后端来保持合并,我希望有一个同步的解决方案。

我也不想在带有argMax或final的查询中执行此操作,因为我想在写入时执行替换重复数据消除,以便从SQL查询中删除argMax。

这是不可能的。CH不是MySQL。

https://github.com/ClickHouse/ClickHouse/issues/5125

您可以查看ReplacingMergeTree引擎,如果排序键相同,该引擎将更新/替换记录。

https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/replacingmergetree

CREATE TABLE myFirstReplacingMT
(
`key` Int64,
`someCol` String,
`eventTime` DateTime
)
ENGINE = ReplacingMergeTree
ORDER BY key;
INSERT INTO myFirstReplacingMT Values (1, 'first', '2020-01-01 01:01:01');
INSERT INTO myFirstReplacingMT Values (1, 'second', '2020-01-01 00:00:00');
SELECT * FROM myFirstReplacingMT FINAL;
┌─key─┬─someCol─┬───────────eventTime─┐
│   1 │ second  │ 2020-01-01 00:00:00 │
└─────┴─────────┴─────────────────────┘

FINAL关键字在这里很重要,因为这会强制在返回结果之前进行替换。如果没有这一指示,更换最终将按照无法确定的时间表进行。FINAL只需要调用一次。

最新更新