10_clickhouse,SummingMergeTree,AggregatingMergeTree(基於表,物化檢視的使用)
阿新 • • 發佈:2020-12-09
技術標籤:# ClickHouse
8.SummingMergeTree
8.1.SummingMergeTree
8.2.案例
9.AggregatingMergeTree
9.1.AggregatingMergeTree
9.2.案例1:基於表
9.3.案例2:物化檢視的使用
8.SummingMergeTree
8.1.SummingMergeTree
- 根據排序鍵對數值型別的列進行彙總求和。
- 相同排序鍵的行合併為一行。
- 如果一個排序鍵對應大量的行,則該引擎能顯著減少儲存空間並加快資料查詢的速度。
- 建議該引擎與MergeTree引擎結合。完整的資料儲存在MergeTree表中,使用SummingMergeTree儲存聚合資料,可以防止排序鍵的組合不正確而丟失有價值的資料。
指定表引擎:
ENGINE = SummingMergeTree([columns])
引數:columns,具有列名稱的元組,其中的值將被彙總。可選引數。
列必須是數值型別,並且不能是主鍵中列。
如果columns引數沒有指定,ClickHouse將彙總除了主鍵列之外的所有數值型別列的值。
彙總規則:
數值型別的列的值會被彙總,列的集合由引數columns定義。
如果求和的所有列中的值都為0,則刪除該行。
如果列不在主鍵中且未彙總,則從現有的值中任意選擇一個值。
主鍵中的列不會彙總。
ClickHouse可能不會完整地彙總所有行,因此需在查詢中使用聚合函式sum和GROUP BY子句。
8.2.案例
drop table summtt;
CREATE TABLE summtt
(
key String,
name String,
value Int32
)
ENGINE = SummingMergeTree()
ORDER BY key;
insert into summtt values('a', 'xiaoa1', 1);
insert into summtt values('a', 'xiaoa2', 2);
insert into summtt values('b', 'xiaob1', 10);
insert into summtt values('b' , 'xiaob2', 20);
insert into summtt values('c', 'xiaob1', 10);
insert into summtt values('c', 'xiaob2', -10);
然後執行
SELECT * FROM summtt;
┌─key─┬─name───┬─value─┐
│ a │ xiaoa1 │ 3 │
│ b │ xiaob1 │ 30 │
│ c │ xiaob1 │ 10 │
└─────┴────────┴───────┘
┌─key─┬─name───┬─value─┐
│ c │ xiaob2 │ -10 │
└─────┴────────┴───────┘
執行計劃外的合併:
optimize table summtt;
然後再檢視結果:
xxxxx :) select * from summtt;
SELECT *
FROM summtt
┌─key─┬─name───┬─value─┐
│ a │ xiaoa1 │ 3 │
│ b │ xiaob2 │ 20 │
└─────┴────────┴───────┘
2 rows in set. Elapsed: 0.006 sec.
xxxxx :)
從上案例可以知道,排序鍵是key,沒有指定key的時候,按照key鍵進行分組彙總,只對數值列進行彙總,非數值列隨機取值,另外c鍵彙總後,value的值為0,此行被刪除。
上面的自動合併的過程類似:
xxxxx :) select key, sum(value) from summtt group by key;
SELECT
key,
sum(value)
FROM summtt
GROUP BY key
┌─key─┬─sum(value)─┐
│ b │ 30 │
│ a │ 3 │
└─────┴────────────┘
2 rows in set. Elapsed: 0.008 sec.
xxxxx :)
9.AggregatingMergeTree
9.1.AggregatingMergeTree
- AggregatingMergeTree可用於增量資料聚合,包括物化檢視的聚合。
- 將相同排序健的所有行(在一個數據片段內)替換為一行,該行儲存了聚合函式狀態的組合。
- 該引擎需結合AggregateFunction資料型別的列使用。
指定表引擎:
ENGINE = AggregatingMergeTree()
資料插入:
使用帶-State字尾的聚合函式。如sumState、uniqState等。
資料查詢:
使用GROUP BY子句和聚合函式(與插入的聚合函式相同),但是使用-Merge字尾的聚合函式。如sumMerge、uniqueMerge等。
9.2.案例1:基於表
DROP TABLE IF EXISTS test_aggregates;
CREATE TABLE test_aggregates
(
d Date,
sumV AggregateFunction(sum, UInt64),
uniqV AggregateFunction(uniq, UInt64)
)
ENGINE = AggregatingMergeTree()
ORDER BY d;
INSERT INTO test_aggregates
SELECT
toDate('2020-06-01') AS d,
sumState(number) as sumV,
uniqState(number) AS uniqV
FROM
(
SELECT toUInt64(number%8) as number FROM system.numbers LIMIT 10
);
xxxxx :) select * from test_aggregates;
SELECT *
FROM test_aggregates
┌──────────d─┬─sumV─┬─uniqV────────┐
│ 2020-06-01 │ _x001D_ │u鏘 ޑh⭋4uULԳE|ȧe │
└────────────┴──────┴──────────────┘
1 rows in set. Elapsed: 0.005 sec.
xxxxx :) select sumMerge(sumV),uniqMerge(uniqV) FROM test_aggregates;
SELECT
sumMerge(sumV),
uniqMerge(uniqV)
FROM test_aggregates
┌─sumMerge(sumV)─┬─uniqMerge(uniqV)─┐
│ 29 │ 8 │
└────────────────┴──────────────────┘
1 rows in set. Elapsed: 0.007 sec.
xxxxx :)
9.3.案例2:物化檢視的使用
drop table t_basic;
create table t_basic(key String, sign UInt8, userId String) ENGINE=MergeTree order by key;
drop table t_m_view;
CREATE MATERIALIZED VIEW t_m_view
ENGINE = AggregatingMergeTree() ORDER BY (key)
AS SELECT
key,
sumState(sign) AS sumSign,
uniqState(userId) AS uniqUsers
FROM t_basic
GROUP BY key;
插入3條記錄:
insert into t_basic values('a', 1, '11'),('a', 2, '22'),('a', 3, '11');
檢視資料:
xxxxx :) select * from t_basic;
SELECT *
FROM t_basic
┌─key─┬─sign─┬─userId─┐
│ a │ 1 │ 11 │
│ a │ 2 │ 22 │
│ a │ 3 │ 11 │
└─────┴──────┴────────┘
xxxxx :) select key,sumMerge(sumSign),uniqMerge(uniqUsers) from t_m_view group by key;
SELECT
key,
sumMerge(sumSign),
uniqMerge(uniqUsers)
FROM t_m_view
GROUP BY key
┌─key─┬─sumMerge(sumSign)─┬─uniqMerge(uniqUsers)─┐
│ a │ 6 │ 2 │
└─────┴───────────────────┴──────────────────────┘
1 rows in set. Elapsed: 0.006 sec.
xxxxx :)