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經典中文文檔分享

參考文章