【ClickHouse 技术系列】- ClickHouse 聚合函数和聚合状态
簡介:本文翻譯自 Altinity 針對 ClickHouse 的系列技術文章。面向聯機分析處理(OLAP)的開源分析引擎 ClickHouse,因其優良的查詢性能,PB級的數據規模,簡單的架構,被國內外公司廣泛采用。本系列技術文章,將詳細展開介紹 ClickHouse。
前言
本文翻譯自 Altinity 針對 ClickHouse 的系列技術文章。面向聯機分析處理(OLAP)的開源分析引擎 ClickHouse,因其優良的查詢性能,PB 級的數據規模,簡單的架構,被國內外公司廣泛采用。
阿里云 EMR-OLAP 團隊,基于開源 ClickHouse 進行了系列優化,提供了開源 OLAP 分析引擎 ClickHouse 的云上托管服務。EMR ClickHouse 完全兼容開源版本的產品特性,同時提供集群快速部署、集群管理、擴容、縮容和監控告警等云上產品功能,并且在開源的基礎上優化了 ClickHouse 的讀寫性能,提升了 ClickHouse 與 EMR 其他組件快速集成的能力。訪問 ClickHouse - E-MapReduce - 阿里云 了解詳情。
譯者:何源(荊杭),阿里云計算平臺事業部高級產品專家
ClickHouse 聚合函數和聚合狀態
ClickHouse 可能有一個獨特的功能——聚合狀態(除了聚合函數外)。你可以參考 ?和 ?組合子的文檔。
簡而言之,許多數據庫使用概率數據結構,例如 HyperLogLog(簡稱 HLL)。它用于唯一/去重計算,你可以在Spark、ElasticSearch、Flink、Postgres、BigQuery 和 Redis 等服務中看到它的效果。但通常你只能在聚合函數中應用此函數一次,例如查詢每月唯一用戶數——得到一個數字,這樣就知足了。由于 HLL 結構沒有對應的內部格式,因此無法重用預聚合或部分聚合的數據。而在 ClickHouse 中,你可以這樣做,因為 HLL 結構是一致的。
ClickHouse 的速度非常快,其基本思路是處理原始數據而不是預聚合數據。但是讓我們做個實驗。例如,我們需要為上個月的唯一用戶數計算一些指標。
設想:每天預聚合,然后匯總所有結果。這就是所謂的存儲空間方法——以后你可以只匯總最后 30 個測量值來計算上個月的統計數據,或者只匯總最后 7 個測量值來計算上周的統計數據。
創建我們的預聚合表:
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)。我們關注的是一些獨特的指標,這些指標是在 String 列上計算的(為了進一步優化,你可能應該使用 FixedString 或二進制數據)。
讓我們將數據插入預聚合表:
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;進行冒煙測試,確認其可以正常運行:
SELECT uniqMerge(value) FROM events_unique GROUP BY product_id;現在讓我們比較原始表和預聚合表的查詢性能。原始查詢:
SELECT uniq(visitor_id) AS c FROM events WHERE client_id = ‘aaaaaaaa’ 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.)預聚合表的結果:
SELECT uniqMerge(value) AS c FROM events_unique WHERE client_id = ‘aaaaaaaa’ 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.)結果表明,我們的處理時間縮短到 1/20。
在實踐中,將物化視圖與 AggregatingMergeTree 引擎結合使用,會比使用單獨的表更方便。
總結
ClickHouse 可讓你將聚合狀態存儲在數據庫中,而不僅僅是存儲在業務應用中,這有望帶來頗具吸引力的性能優化和新用例。有關更多詳細信息,請查看關于 AggregatingMergeTree 引擎的豐富文檔。
后續
您已經了解了在 ClickHouse 中處理實時更新相關內容,本系列還包括其他內容:
- 在 ClickHouse 中處理實時更新
- 使用新的 TTL move,將數據存儲在合適的地方
- 在 ClickHouse 物化視圖中使用 Join
- ClickHouse 聚合函數和聚合狀態(本文)
- ClickHouse 中的嵌套數據結構
原文鏈接
本文為阿里云原創內容,未經允許不得轉載。?
總結
以上是生活随笔為你收集整理的【ClickHouse 技术系列】- ClickHouse 聚合函数和聚合状态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Joint Consensus两阶段成员
- 下一篇: 看懂这5幅图,研发效能分析和改进就容易了