1. 程式人生 > 其它 >10_clickhouse,SummingMergeTree,AggregatingMergeTree(基於表,物化檢視的使用)

10_clickhouse,SummingMergeTree,AggregatingMergeTree(基於表,物化檢視的使用)

技術標籤:# ClickHouse

8.SummingMergeTree
8.1.SummingMergeTree
8.2.案例
9.AggregatingMergeTree
9.1.AggregatingMergeTree
9.2.案例1:基於表
9.3.案例2:物化檢視的使用

8.SummingMergeTree

8.1.SummingMergeTree

  1. 根據排序鍵對數值型別的列進行彙總求和。
  2. 相同排序鍵的行合併為一行。
  3. 如果一個排序鍵對應大量的行,則該引擎能顯著減少儲存空間並加快資料查詢的速度。
  4. 建議該引擎與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

  1. AggregatingMergeTree可用於增量資料聚合,包括物化檢視的聚合。
  2. 將相同排序健的所有行(在一個數據片段內)替換為一行,該行儲存了聚合函式狀態的組合。
  3. 該引擎需結合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)─┐
│             298 │
└────────────────┴──────────────────┘

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   │    111     │
│ a   │    222     │
│ a   │    311     │
└─────┴──────┴────────┘

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   │                 62 │
└─────┴───────────────────┴──────────────────────┘

1 rows in set. Elapsed: 0.006 sec. 

xxxxx :)