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引擎的數據處理策略,主要是下面五個點。
- 使用ORBER BY排序鍵作為判斷重複數據的唯一鍵。
- 只有在合併分區的時候才會觸發刪除重複數據的邏輯。
- 以數據分區為單位刪除重複數據。當分區合併時,同一分區內的重複數據會被刪除;不同分區之間的重複數據不會被刪除。
- 在進行數據去重時,因為分區內的數據已經基於ORBER BY進行了排序,所以能夠找到那些相鄰的重複數據。
- 在數據合併的時候,ReplacingMergeTree 從所有具有相同排序鍵的行中選擇一行留下:如果ver列未指定,保留最後一條。如果ver列已指定,保留ver值最大的版本。
資料分享
參考文章
- ClickHouse(01)什麼是ClickHouse,ClickHouse適用於什麼場景
- ClickHouse(02)ClickHouse架構設計介紹概述與ClickHouse數據分片設計
- ClickHouse(03)ClickHouse怎麼安裝和部署
- ClickHouse(04)如何搭建ClickHouse集群
- ClickHouse(05)ClickHouse數據類型詳解
- ClickHouse(06)ClickHouse建表語句DDL詳細解析
- ClickHouse(07)ClickHouse資料庫引擎解析
- ClickHouse(08)ClickHouse表引擎概況
- ClickHouse(09)ClickHouse合併樹MergeTree家族表引擎之MergeTree詳細解析
- ClickHouse(10)ClickHouse合併樹MergeTree家族表引擎之ReplacingMergeTree詳細解析
- ClickHouse(11)ClickHouse合併樹MergeTree家族表引擎之SummingMergeTree詳細解析