HyperLogLog 函數

Presto 使用 HyperLogLog 資料結構實作 approx_distinct() 函數。

資料結構

Presto 將 HyperLogLog 資料草圖實作為一組 32 位元的儲存桶,其中儲存最大雜湊值。它們可以稀疏地儲存(以從儲存桶 ID 到儲存桶的映射形式),也可以密集地儲存(以連續的記憶體區塊形式)。HyperLogLog 資料結構一開始是稀疏表示法,當密集表示法更有效率時會切換為密集表示法。P4HyperLogLog 結構會密集初始化,並且在其生命週期中保持密集。

HyperLogLog 會隱式轉換為 P4HyperLogLog,同時也可以將 HyperLogLog 明確轉換為 P4HyperLogLog

cast(hll AS P4HyperLogLog)

序列化

資料草圖可以序列化為 varbinary,並從中還原序列化。這允許它們儲存以供日後使用。結合合併多個草圖的能力,這允許人們計算查詢分割區的元素中的 :func:!approx_distinct`,然後以非常低的成本計算整個查詢的元素中的 :func:!approx_distinct`。

例如,計算每日唯一使用者的 HyperLogLog 將允許透過結合每日使用者來增量計算每週或每月唯一使用者。這類似於透過加總每日收入來計算每週收入。GROUPING SETSapprox_distinct() 使用方式可以轉換為使用 HyperLogLog。範例

CREATE TABLE visit_summaries (
  visit_date date,
  hll varbinary
);

INSERT INTO visit_summaries
SELECT visit_date, cast(approx_set(user_id) AS varbinary)
FROM user_visits
GROUP BY visit_date;

SELECT cardinality(merge(cast(hll AS HyperLogLog))) AS weekly_unique_users
FROM visit_summaries
WHERE visit_date >= current_date - interval '7' day;

函數

approx_set(x) -> HyperLogLog()

傳回 x 輸入資料集的 HyperLogLog 草圖。最大標準誤差的值預設為 0.01625。此資料草圖是 approx_distinct() 的基礎,並且可以儲存並稍後透過呼叫 cardinality() 使用。

approx_set(x, e) -> HyperLogLog()

傳回 x 輸入資料集的 HyperLogLog 草圖,其最大標準誤差為 e。此函數的目前實作要求 e 的範圍在 [0.0040625, 0.26000] 之間。此資料草圖是 approx_distinct() 的基礎,並且可以儲存並稍後透過呼叫 cardinality() 使用。

cardinality(hll) -> bigint()

這將在 hll HyperLogLog 資料草圖彙總的資料上執行 approx_distinct()

empty_approx_set() -> HyperLogLog()

傳回空的 HyperLogLog。最大標準誤差的值預設為 0.01625

empty_approx_set(e) -> HyperLogLog()

傳回空的 HyperLogLog,其最大標準誤差為 e。此函數的目前實作要求 e 的範圍在 [0.0040625, 0.26000] 之間。

merge(HyperLogLog) -> HyperLogLog()

傳回個別 hll HyperLogLog 結構的彙總聯集的 HyperLogLog

merge_hll(array(HyperLogLog)) -> HyperLogLog()

傳回陣列 hll HyperLogLog 結構聯集的 HyperLogLog