在clickhouse使用過程中,針對數據量和查詢場景,MergeTree是最常用也是較為合適的表引擎。針對特定的業務,MergeTree的子引擎可以針對不同的業務而定,但都基於MergeTree引擎
1. ReplacingMergeTree
說明:
該引擎和MergeTree的不同之處在於它會刪除具有相同主鍵的重復項。數據的去重只會在合並的過程中出現。合並會在未知的時間在后台進行,所以你無法預先作出計划。有一些數據可能仍未被處理。因此,ReplacingMergeTree適用於在后台清除重復的數據以節省空間,但是它不保證沒有重復的數據出現。同時ReplacingMergeTree在一定程度上可以彌補clickhouse不能對數據做更新的操作。
a. 創建ReplacingMergeTree
表
創表語法:
ver — 版本列。類型為UInt*
,Date或``DateTime
,可選參數。其他參數與父引擎MergeTree一樣
被棄用的創表語法:
CREATE TABLE rmt_tab(date Date,id UInt8,name String,version UInt8) ENGINE=ReplacingMergeTree(version) PARTITION BY date ORDER BY (id,name) SAMPLE BY name
b. 插入數據
insert into rmt_tab values ('2019-07-11',1,'Jason',1);
insert into rmt_tab values ('2019-07-11',1,'Jason',1);
insert into rmt_tab values ('2019-07-11',1,'Jason',2);
insert into rmt_tab values ('2019-07-12',2,'Tom',1);
insert into rmt_tab values ('2019-07-12',2,'Tom',1);
insert into rmt_tab values ('2019-07-12',2,'Tom',2);
c. 等待后台自動merge或通過optimize table rmt_tab
命令手動Merge
后查詢
name為Jason的數據並未去重,而name為Tom的數據去重后只有一條。總共有四片數據
d. 使用場景
在數據過多重復場景對數據進行去重
2. SummingMergeTree
說明:
當合並 SummingMergeTree 表的數據片段時,ClickHouse 會把所有具有相同主鍵的行合並為一行,該行包含了被合並的行中具有數值數據類型的列的匯總值。如果主鍵的組合方式使得單個鍵值對應於大量的行,則可以顯著的減少存儲空間並加快數據查詢的速度,對於不可加的列,會取一個最先出現的值
a. 創建SummingMergeTree
表
創表語法:
被棄用的語法:
CREATE TABLE smt_tab(date Date,id UInt8,name String,a UInt16) ENGINE=SummingMergeTree(a) PARTITION BY date ORDER BY (id,name) SAMPLE BY name
b. 插入數據
insert into smt_tab (date,id,name,a) values ('2019-12-12',1,'Jason',1)
insert into smt_tab (date,id,name,a) values ('2019-12-12',1,'Jason',2)
insert into smt_tab (date,id,name,a) values ('2019-12-12',1,'Jason',3)
c. 等待后台自動merge
或通過optimize table smt_tab
命令手動Merge
后查詢
在非a列的相同的情況下,只有一行數據,a列被sum
了。
相當於已經做了以下語句的操作:
select date,id,name,sum(a) from smt_tab group by a;
注意:
如果用於匯總的所有列中的值均為0,則該行會被刪除。
如果匯總的類為主鍵則不會被匯總
d. 使用場景
對某個字段長期的匯總查詢場景
3.AggregatingMergeTree
說明:
該引擎繼承自 MergeTree,並改變了數據片段的合並邏輯。 ClickHouse 會將相同主鍵的所有行(在一個數據片段內)替換為單個存儲一系列聚合函數狀態的行。
可以使用 AggregatingMergeTree 表來做增量數據統計聚合,包括物化視圖的數據聚合。
引擎需使用 AggregateFunction 類型來處理所有列。
如果要按一組規則來合並減少行數,則使用 AggregatingMergeTree 是合適的。
對於AggregatingMergeTree不能直接使用insert來查詢寫入數據。一般是用insert select。但更常用的是創建物化視圖
a. 先創建一個MergeTree
引擎的基表
CREATE TABLE amt_basic_tab(date Date,D1 String,D2 String,D3 String,M1 UInt16) ENGINE MergeTree() PARTITION BY date ORDER BY (D1,D2,D3)
b. 往基表寫入數據
insert into amt_basic_tab (date, D1, D2, D3, M1) values ('2017-07-10', '甲', 'a', '1', 1);
insert into amt_basic_tab (date, D1, D2, D3, M1) values ('2017-07-10', '甲', 'a', '1', 1);
insert into amt_basic_tab (date, D1, D2, D3, M1) values ('2017-07-10', '甲', 'b', '2', 1);
insert into amt_basic_tab (date, D1, D2, D3, M1) values ('2017-07-10', '乙', 'b', '3', 1);
insert into amt_basic_tab (date, D1, D2, D3, M1) values ('2017-07-10', '丙', 'b', '2', 1);
insert into amt_basic_tab (date, D1, D2, D3, M1) values ('2017-07-10', '丙', 'c', '1', 1);
insert into amt_basic_tab (date, D1, D2, D3, M1) values ('2017-07-10', '丁', 'c', '2', 1);
insert into amt_basic_tab (date, D1, D2, D3, M1) values ('2017-07-10', '丁', 'a', '1', 1);
c. 創建一個AggregatingMergeTree
的物化視圖
create materialized view amt_tab_view ENGINE = AggregatingMergeTree() PARTITION BY date ORDER BY (D2,D3) as select date,D2, D3, uniqState(D1) as uv from amt_basic_tab group by date,D2,D3;
d. 根據b往基表寫數據的方法重寫寫一次將數據填充到物化視圖amt_tab_view
中並查詢
可以看出數據有四片
e. 通過optimize table amt_tab_view
命令手動Merge
后查詢
數據只有一片了
這里可能還是沒有明白AggregatingMergeTree的作用
對比基表amt_basic_tab
和物化視圖amt_tab_view
的數據就很清晰了
amt_basic_tab:
amt_tab_view
f. 使用場景
可以使用AggregatingMergeTree
表來做增量數據統計聚合,包括物化視圖的數據聚合。
4. CollapsingMergeTree
說明:
yandex官方給出的介紹是CollapsingMergeTree 會異步的刪除(折疊)這些除了特定列 Sign 有 1 和 -1 的值以外,其余所有字段的值都相等的成對的行。沒有成對的行會被保留。該引擎可以顯著的降低存儲量並提高 SELECT 查詢效率。
CollapsingMergeTree引擎有個狀態列sign,這個值1為”狀態”行,-1為”取消”行,對於數據只關心狀態列為狀態的數據,不關心狀態列為取消的數據
a. 創建CollapsingMergeTree
表
創表語法:
CREATE TABLE cmt_tab(sign Int8,date Date,name String,point String) ENGINE=CollapsingMergeTree(sign) PARTITION BY date ORDER BY (name) SAMPLE BY name
b. 插入數據:
insert into cmt_tab(sign,date,name,point) values (1,'2019-12-13','cctv','100000')
insert into cmt_tab(sign,date,name,point) values (-1,'2019-12-13','cctv','100000')
insert into cmt_tab(sign,date,name,point) values (1,'2019-12-13','hntv','10000')
insert into cmt_tab(sign,date,name,point) values (-1,'2019-12-13','hntv','10000')
insert into cmt_tab(sign,date,name,point) values (1,'2019-12-13','hbtv','11000')
insert into cmt_tab(sign,date,name,point) values (-1,'2019-12-13','hbtv','11000')
insert into cmt_tab(sign,date,name,point) values (1,'2019-12-14','cctv','200000')
insert into cmt_tab(sign,date,name,point) values (1,'2019-12-14','hntv','15000')
insert into cmt_tab(sign,date,name,point) values (1,'2019-12-14','hbtv','16000')
c. 通過optimize table amt_tab_view
命令手動Merge
后查詢
d.使用場景
大數據中對於數據更新很難做到,比如統計一個網站或TV的在用戶數,更多場景都是選擇用記錄每個點的數據,再對數據進行一定聚合查詢。而clickhouse通過CollapsingMergeTree就可以實現,所以使得CollapsingMergeTree大部分用於OLAP場景
5. VersionedCollapsingMergeTree
這個引擎和CollapsingMergeTree
差不多,只是對CollapsingMergeTree
引擎加了一個版本,比如可以適用於非實時用戶在線統計,統計每個節點用戶在在線業務
a. 創表語法