【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 中處理實時更新相關內容,本系列還包括其他內容:

原文鏈接
本文為阿里雲原創內容,未經允許不得轉載。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM