【ClickHouse 技术系列】- ClickHouse 聚合函数和聚合状态
簡(jiǎn)介:本文翻譯自 Altinity 針對(duì) ClickHouse 的系列技術(shù)文章。面向聯(lián)機(jī)分析處理(OLAP)的開源分析引擎 ClickHouse,因其優(yōu)良的查詢性能,PB級(jí)的數(shù)據(jù)規(guī)模,簡(jiǎn)單的架構(gòu),被國內(nèi)外公司廣泛采用。本系列技術(shù)文章,將詳細(xì)展開介紹 ClickHouse。
前言
本文翻譯自 Altinity 針對(duì) ClickHouse 的系列技術(shù)文章。面向聯(lián)機(jī)分析處理(OLAP)的開源分析引擎 ClickHouse,因其優(yōu)良的查詢性能,PB 級(jí)的數(shù)據(jù)規(guī)模,簡(jiǎn)單的架構(gòu),被國內(nèi)外公司廣泛采用。
阿里云 EMR-OLAP 團(tuán)隊(duì),基于開源 ClickHouse 進(jìn)行了系列優(yōu)化,提供了開源 OLAP 分析引擎 ClickHouse 的云上托管服務(wù)。EMR ClickHouse 完全兼容開源版本的產(chǎn)品特性,同時(shí)提供集群快速部署、集群管理、擴(kuò)容、縮容和監(jiān)控告警等云上產(chǎn)品功能,并且在開源的基礎(chǔ)上優(yōu)化了 ClickHouse 的讀寫性能,提升了 ClickHouse 與 EMR 其他組件快速集成的能力。訪問 ClickHouse - E-MapReduce - 阿里云 了解詳情。
譯者:何源(荊杭),阿里云計(jì)算平臺(tái)事業(yè)部高級(jí)產(chǎn)品專家
ClickHouse 聚合函數(shù)和聚合狀態(tài)
ClickHouse 可能有一個(gè)獨(dú)特的功能——聚合狀態(tài)(除了聚合函數(shù)外)。你可以參考 ?和 ?組合子的文檔。
簡(jiǎn)而言之,許多數(shù)據(jù)庫使用概率數(shù)據(jù)結(jié)構(gòu),例如 HyperLogLog(簡(jiǎn)稱 HLL)。它用于唯一/去重計(jì)算,你可以在Spark、ElasticSearch、Flink、Postgres、BigQuery 和 Redis 等服務(wù)中看到它的效果。但通常你只能在聚合函數(shù)中應(yīng)用此函數(shù)一次,例如查詢每月唯一用戶數(shù)——得到一個(gè)數(shù)字,這樣就知足了。由于 HLL 結(jié)構(gòu)沒有對(duì)應(yīng)的內(nèi)部格式,因此無法重用預(yù)聚合或部分聚合的數(shù)據(jù)。而在 ClickHouse 中,你可以這樣做,因?yàn)?HLL 結(jié)構(gòu)是一致的。
ClickHouse 的速度非常快,其基本思路是處理原始數(shù)據(jù)而不是預(yù)聚合數(shù)據(jù)。但是讓我們做個(gè)實(shí)驗(yàn)。例如,我們需要為上個(gè)月的唯一用戶數(shù)計(jì)算一些指標(biāo)。
設(shè)想:每天預(yù)聚合,然后匯總所有結(jié)果。這就是所謂的存儲(chǔ)空間方法——以后你可以只匯總最后 30 個(gè)測(cè)量值來計(jì)算上個(gè)月的統(tǒng)計(jì)數(shù)據(jù),或者只匯總最后 7 個(gè)測(cè)量值來計(jì)算上周的統(tǒng)計(jì)數(shù)據(jù)。
創(chuàng)建我們的預(yù)聚合表:
create table events_unique (date Date, group_id String, client_id String, event_type String, product_id String, value AggregateFunction(uniq, String) ) ENGINE = MergeTree(date, (group_id, client_id, event_type, product_id, date), 8192);這里將我的聚合聲明為 AggregateFunction(uniq, String)。我們關(guān)注的是一些獨(dú)特的指標(biāo),這些指標(biāo)是在 String 列上計(jì)算的(為了進(jìn)一步優(yōu)化,你可能應(yīng)該使用 FixedString 或二進(jìn)制數(shù)據(jù))。
讓我們將數(shù)據(jù)插入預(yù)聚合表:
INSERT INTO events_unique SELECT date, group_id, client_id, event_type, product_id, uniqState(visitor_id) AS value FROM events GROUP BY date, group_id, client_id, event_type, product_id;進(jìn)行冒煙測(cè)試,確認(rèn)其可以正常運(yùn)行:
SELECT uniqMerge(value) FROM events_unique GROUP BY product_id;現(xiàn)在讓我們比較原始表和預(yù)聚合表的查詢性能。原始查詢:
SELECT uniq(visitor_id) AS c FROM events WHERE client_id = ‘a(chǎn)aaaaaaa’ AND event_type = ‘click’ AND product_id = ‘product1’ AND date >= ‘2017–01–20’ AND date < ‘2017–02–20’;┌──────c─┐ │ 457954 │ └────────┘ 1 rows in set. Elapsed: 0.948 sec. Processed 13.22 million rows, 1.61 GB (13.93 million rows/s., 1.70 GB/s.)預(yù)聚合表的結(jié)果:
SELECT uniqMerge(value) AS c FROM events_unique WHERE client_id = ‘a(chǎn)aaaaaaa’ AND event_type = ‘click’ AND product_id = ‘product1’ AND date >= ‘2017–01–20’ AND date < ‘2017–02–20’;┌──────c─┐ │ 457954 │ └────────┘ 1 rows in set. Elapsed: 0.050 sec. Processed 39.39 thousand rows, 8.55 MB (781.22 thousand rows/s., 169.65 MB/s.)結(jié)果表明,我們的處理時(shí)間縮短到 1/20。
在實(shí)踐中,將物化視圖與 AggregatingMergeTree 引擎結(jié)合使用,會(huì)比使用單獨(dú)的表更方便。
總結(jié)
ClickHouse 可讓你將聚合狀態(tài)存儲(chǔ)在數(shù)據(jù)庫中,而不僅僅是存儲(chǔ)在業(yè)務(wù)應(yīng)用中,這有望帶來頗具吸引力的性能優(yōu)化和新用例。有關(guān)更多詳細(xì)信息,請(qǐng)查看關(guān)于 AggregatingMergeTree 引擎的豐富文檔。
后續(xù)
您已經(jīng)了解了在 ClickHouse 中處理實(shí)時(shí)更新相關(guān)內(nèi)容,本系列還包括其他內(nèi)容:
- 在 ClickHouse 中處理實(shí)時(shí)更新
- 使用新的 TTL move,將數(shù)據(jù)存儲(chǔ)在合適的地方
- 在 ClickHouse 物化視圖中使用 Join
- ClickHouse 聚合函數(shù)和聚合狀態(tài)(本文)
- ClickHouse 中的嵌套數(shù)據(jù)結(jié)構(gòu)
原文鏈接
本文為阿里云原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。?
總結(jié)
以上是生活随笔為你收集整理的【ClickHouse 技术系列】- ClickHouse 聚合函数和聚合状态的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Joint Consensus两阶段成员
- 下一篇: 看懂这5幅图,研发效能分析和改进就容易了