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引擎的資料處理策略,主要是下面五個點。
本文來自部落格園,作者:張飛的豬,轉載請註明原文連結:https://www.cnblogs.com/the-pig-of-zf/p/16874891.html
作者公眾號:張飛的豬巨量資料分享,不定期分享巨量資料學習的總結和相關資料,歡迎關注。