2

ClickHouse(10)ClickHouse合并树MergeTree家族表引擎之ReplacingMergeTree详细解析 -...

 1 year ago
source link: https://www.cnblogs.com/the-pig-of-zf/p/16874891.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

ClickHouse(10)ClickHouse合并树MergeTree家族表引擎之ReplacingMergeTree详细解析

MergeTree拥有主键,但是它的主键却没有唯一键的约束。这意味着即便多行数据的主键相同,它们还是能够被正常写入。在某些使用场合,用户并不希望数据表中含有重复的数据。ReplacingMergeTree就是在这种背景下为了数据去重而设计的,它能够在合并分区时删除重复的数据。但是ReplacingMergeTree并不一定保证不会出现重复的数据。

ReplacingMergeTree是另外一个常用的表引擎,ReplacingMergeTree和MergeTree的不同之处在于它会删除排序键值相同的重复项。

数据的去重只会在数据合并期间进行。合并会在后台一个不确定的时间进行,因此你无法预先作出计划。有一些数据可能仍未被处理。可以调用OPTIMIZE语句发起计划外的合并,但尽量不要依靠它,因为OPTIMIZE语句会引发对数据的大量读写。

因此,ReplacingMergeTree适用于在后台清除重复的数据以节省空间,但是它不保证没有重复的数据出现。

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表的参数中,与MergeTree不同的是[ver]。ver(版本列)。类可以型为UInt*,Date或DateTime。这个属于可选参数,所以你也可以不用指定。

在数据合并的时候,ReplacingMergeTree 从所有具有相同排序键的行中选择一行留下:如果ver列未指定,保留最后一条。如果ver列已指定,保留ver值最大的版本。

其他的与MergeTree表是一致,它属于MergeTree表的的一个变种。

MergeTree表引擎的解析可以参考ClickHouse(09)ClickHouse合并树MergeTree家族表引擎之MergeTree详细解析

数据处理策略

最后总结一下ReplacingMergeTree引擎的数据处理策略,主要是下面五个点。

  1. 使用ORBER BY排序键作为判断重复数据的唯一键。
  2. 只有在合并分区的时候才会触发删除重复数据的逻辑。
  3. 以数据分区为单位删除重复数据。当分区合并时,同一分区内的重复数据会被删除;不同分区之间的重复数据不会被删除。
  4. 在进行数据去重时,因为分区内的数据已经基于ORBER BY进行了排序,所以能够找到那些相邻的重复数据。
  5. 在数据合并的时候,ReplacingMergeTree 从所有具有相同排序键的行中选择一行留下:如果ver列未指定,保留最后一条。如果ver列已指定,保留ver值最大的版本。

ClickHouse经典中文文档分享


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK