暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

clickhouse 使用ReplacingMergeTree表引擎

Ty3306 2022-12-24
1661

使用ReplacingMergeTree表引擎
在创建该引擎的数据表时一般会创建一个ver字段,该引擎在后台合并分区数据时会删除:主键(order by 后面的列)相同,而ver较小的数据行,只会保留一条ver最大的那一条数据。若没有指定ver字段,会保留主键相同,最新的一条数据。这样,就间接的通过insert操作实现了数据的删除、更新。

要注意的是,Clickhouse后台的数据合并操作不是立即执行的,而是要等到分区数据合并时才会执行,而后台数据合并的时间是不确定的,业务实现时不能依赖这个时间。

那么,若我们想要让数据替换操作立即生效,该怎么办呢?Clickhouse也提供了一个选择,那就是在查询语句时添加final关键字。添加final关键字后,会根据规则自动去重数据,但可能对查询的性能有一定影响。

另外,还需要注意,必须是同一个分区的数据才会被合并。也就是说,要想对相同主键的数据去重,必须保证这些数据处于同一个分区;那么,若是分布式表,首先要保证数据落到同一个节点上。

该引擎的建表语句如下:

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = ReplacingMergeTree([ver])
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]

从建表语句可以看到,在创建表时ReplacingMergeTree的引擎中,必须指定ver字段。该引擎的使用,会有专门的文章进行描述。

使用VersionedCollapsingMergeTree表引擎
该引擎会根据:sign, version和主键字段来对数据进行删除(折叠)操作,从而实现数据的更新。

同样,数据的合并必须要主键相同,sign字段为1和-1时,version值相同的两条数据会被合并。而sign的值和version的值,是由数据写入端写入的。

同时,数据也必须处于同一分区时才会合并,数据最终才会被删除。

使用CollapsingMergeTree表引擎
该引擎和VersionedCollapsingMergeTree引擎相同,不过该引擎不需要version字段,而是通过sign字段的值来进行数据的合并。也就是说:sign为-1和1,主键相同的两条数据会被合并(删除)。

这样,业务侧就可以把想要折叠的数据的sign字段设置为-1和1,这样就可以把历史数据删除。

比如:我们有一条id为1数据,其sign为1。当我们想要更新该id的数据时,我们就需要写两条数据,写入一条id为1,sign=-1。再写入一条最新的数据,其sign又设置为1。此时,前两条数据就会抵消,而最终会保留最新的一条数据。

原文链接:https://blog.csdn.net/zg_hover/article/details/124558312

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论