SummingMergeTree引擎繼承自MergeTree。區別在於,當合併SummingMergeTree表的數據片段時,ClickHouse會把所有具有相同主鍵的行合併為一行,該行包含了被合併的行中具有數值數據類型的列的彙總值。如果主鍵的組合方式使得單個鍵值對應於大量的行,則可以顯著的減少存儲 ...
目錄
SummingMergeTree引擎繼承自MergeTree。區別在於,當合併SummingMergeTree表的數據片段時,ClickHouse會把所有具有相同主鍵的行合併為一行,該行包含了被合併的行中具有數值數據類型的列的彙總值。如果主鍵的組合方式使得單個鍵值對應於大量的行,則可以顯著的減少存儲空間並加快數據查詢的速度。
一般SummingMergeTree和MergeTree一起使用。例如,在準備做報告的時候,將完整的數據存儲在MergeTree表中,並且使用SummingMergeTree來存儲聚合數據。這種方法可以避免因為使用不正確的主鍵組合方式而丟失有價值的數據。
建表語法
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = SummingMergeTree([columns])
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]
創建SummingMergeTree表的參數中,與MergeTree不同的是[columns]。columns包含了將要被彙總的列的列名的元組。屬於可選參數。所選的列必須是數值類型,並且不可位於主鍵中。
如果沒有指定columns,ClickHouse會把所有不在主鍵中的數值類型的列都進行彙總。
其他的參數與MergeTree表是一致。
MergeTree表引擎的解析可以參考ClickHouse(09)ClickHouse合併樹MergeTree家族表引擎之MergeTree詳細解析
-- 建表
CREATE TABLE summtt
(
key UInt32,
value UInt32
)
ENGINE = SummingMergeTree()
ORDER BY key;
-- 插入數據
INSERT INTO summtt Values(1,1),(1,2),(2,1);
-- 查詢數據
-- ClickHouse可能不會完整的彙總所有行,因此在查詢中使用了聚合函數sum和GROUP BY子句。
-- ClickHouse定期合併插入的數據片段,併在這個時候對所有具有相同主鍵的行中的列進行彙總,將這些行替換為包含彙總數據的一行記錄。
SELECT key, sum(value) FROM summtt GROUP BY key;
-- 查詢結果
┌─key─┬─sum(value)─┐
│ 2 │ 1 │
│ 1 │ 3 │
└─────┴────────────┘
數據處理
當數據被插入到表中時,他們將被原樣保存。ClickHouse定期合併插入的數據片段,併在這個時候對所有具有相同主鍵的行中的列進行彙總,將這些行替換為包含彙總數據的一行記錄。
ClickHouse會按片段合併數據,以至於不同的數據片段中會包含具有相同主鍵的行,即單個彙總片段將會是不完整的。因此,聚合函數sum()和GROUP BY子句應該在(SELECT)查詢語句中被使用,如上面的例子。
彙總的通用規則
- 列中數值類型的值會被彙總,進行sum操作。這些列的集合在參數columns中被定義。
- 如果用於彙總的所有列中的值均為0,則該行會被刪除。
- 如果列不在主鍵中且無法被彙總,則會在現有的值中任選一個。
- 主鍵所在的列中的值不會被彙總。
AggregateFunction 列中的彙總
對於AggregateFunction類型的列,ClickHouse根據對應函數表現為AggregatingMergeTree引擎的聚合。
嵌套結構數據的處理
表中可以具有以特殊方式處理的嵌套數據結構。
如果嵌套表的名稱以 Map 結尾,並且包含至少兩個符合以下條件的列:
- 第一列是數值類型(Int,Date,DateTime),稱之為key,
- 其他的列是可計算的(Int,Float32/64),稱之為(values...),
然後這個嵌套表會被解釋為一個key=>(values...)的映射,當合併它們的行時,兩個數據集中的元素會被根據key合併為相應的(values...)的彙總值。如下麵的例子。
[(1, 100)] + [(2, 150)] -> [(1, 100), (2, 150)]
[(1, 100)] + [(1, 150)] -> [(1, 250)]
[(1, 100)] + [(1, 150), (2, 150)] -> [(1, 250), (2, 150)]
[(1, 100), (2, 150)] + [(1, -100)] -> [(2, 150)]
請求數據時,使用sumMap(key,value)函數來對Map進行聚合。對於嵌套數據結構,你無需在列的元組中指定列以進行彙總。
資料分享
參考文章
- 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詳細解析
本文來自博客園,作者:張飛的豬,轉載請註明原文鏈接:https://www.cnblogs.com/the-pig-of-zf/p/17056317.html
公眾號:張飛的豬大數據分享,不定期分享大數據學習的總結和相關資料,歡迎關註。
個人網站"張飛的豬編程工作室"鏈接: https://zhangfeidezhu.com