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 SETS
的 approx_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
。