設定摘要函數¶
MinHash,或稱為最小雜湊的獨立置換局部敏感雜湊方案,是一種用於電腦科學的技術,可快速估計兩個集合的相似程度。MinHash 是一種機率性資料結構,可估計 Jaccard 相似係數 — 衡量兩個集合之間重疊程度的指標,以兩個集合中唯一元素總數的百分比表示。Presto 提供多個函數來處理 MinHash 技術。
MinHash 用於快速估計兩個集合之間的 Jaccard 相似係數。它通常用於資料探勘,以大規模偵測幾乎重複的網頁。透過使用此資訊,搜尋引擎可以有效地避免在搜尋結果中顯示兩個幾乎相同的頁面。
資料結構¶
Presto 透過封裝以下元件來實作設定摘要資料草圖
截至目前,HyperLogLog
和 MinHash
是 Presto 中實作或 Presto 中某些函數使用的技術,用於處理大型資料集。
HyperLogLog (HLL)
:HyperLogLog 是一種演算法,用於估計集合的基數 — 也就是大型資料集中不同元素的數量。Presto 使用它來提供 approx_distinct 函數,該函數可用於估計資料行中不同條目的數量。
範例
SELECT approx_distinct(column_name) FROM table_name;
MinHash
:MinHash 用於估計兩個或多個集合之間的相似性,通常稱為 Jaccard 相似性。它在處理大型資料集時特別有效,通常用於資料叢集和幾乎重複偵測。
範例
WITH mh1 AS (SELECT minhash_agg(to_utf8(value)) AS minhash FROM table1), mh2 AS (SELECT minhash_agg(to_utf8(value))
AS minhash FROM table2), SELECT jaccard_index(mh1.minhash, mh2.minhash) AS similarity FROM mh1, mh2;
此資料結構的 Presto 類型稱為 setdigest
。Presto 提供合併多個設定摘要資料草圖的功能。
序列化¶
透過使用 MinHash 或 HyperLogLog 建立的資料草圖可以序列化為 varbinary 資料類型。序列化這些資料結構可以讓它們有效地儲存,並在需要時在不同系統或會話之間傳輸。儲存後,它們可以在需要再次使用時還原序列化回原始狀態。在 Presto 的環境中,您通常會使用在二進制與這些資料草圖之間轉換的函數來執行此操作。一個範例可能包括使用 to_utf8()
或 from_utf8()
。
函數¶
- make_set_digest(x) -> setdigest()¶
將 x
的所有輸入值組合到 setdigest
中。
範例
Create a ``setdigest`` corresponding to a ``bigint`` array:: SELECT make_set_digest(value) FROM (VALUES 1, 2, 3) T(value); Create a ``setdigest`` corresponding to a ``varchar`` array:: SELECT make_set_digest(value) FROM (VALUES 'Presto', 'SQL', 'on', 'everything') T(value);
- merge_set_digest(setdigest) -> setdigest()¶
傳回個別 setdigest
結構的聚合聯集的 setdigest
。
範例
SELECT merge_set_digest(a) from (SELECT make_set_digest(value) as a FROM (VALUES 4,3,2,1) T(value));
- cardinality(setdigest) -> bigint()¶
從其內部 HyperLogLog
元件傳回設定摘要的基數。
範例
SELECT cardinality(make_set_digest(value)) FROM (VALUES 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5) T(value); -- 5
- intersection_cardinality(x,y) -> bigint()¶
傳回兩個設定摘要交集的基數估計值。
x
和 y
的類型必須為 setdigest
範例
SELECT intersection_cardinality(make_set_digest(v1), make_set_digest(v2)) FROM (VALUES (1, 1), (NULL, 2), (2, 3), (3, 4)) T(v1, v2); -- 3
- jaccard_index(x, y) -> double()¶
傳回兩個設定摘要的 Jaccard 索引估計值。
x
和 y
的類型必須為 setdigest
。
範例
SELECT jaccard_index(make_set_digest(v1), make_set_digest(v2)) FROM (VALUES (1, 1), (NULL,2), (2, 3), (NULL, 4)) T(v1, v2); -- 0.5
- hash_counts(x) -> map(bigint, smallint)¶
傳回一個映射,其中包含 Murmur3Hash128 雜湊值,以及它們在屬於 x
或 varchar 的內部 MinHash
結構中出現的次數。
x
的類型必須為 setdigest
。
範例
SELECT hash_counts(make_set_digest(value)) FROM (VALUES 1, 1, 1, 2, 2) T(value); -- {19144387141682250=3, -2447670524089286488=2}