目錄
- 建表語法
- 資料處理
- 匯總的通用規則
- AggregateFunction 列中的匯總
- 嵌套結構資料的處理
- 資料分享
- 參考文章
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經典中文檔案分享
參考文章
- 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/542117.html
標籤:其他
