clickhouse核心引擎MergeTree子引擎


在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. 創表語法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM