本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
範例
本節包含將 HyperLogLog 與 Amazon Redshift 搭配使用的範例。
主題
範例:在子查詢中傳回基數
下列範例會針對名為 Sales 的資料表,傳回子查詢中每個草圖的基數。
CREATE TABLE Sales (customer VARCHAR, country VARCHAR, amount BIGINT); INSERT INTO Sales VALUES ('David Joe', 'Greece', 14.5), ('David Joe', 'Greece', 19.95), ('John Doe', 'USA', 29.95), ('John Doe', 'USA', 19.95), ('George Spanos', 'Greece', 9.95), ('George Spanos', 'Greece', 2.95);
以下查詢為會每個國家/地區的客戶產生 HLL 草圖,並擷取基數。這會顯示了來自每個國家/地區的獨特客戶。
SELECT hll_cardinality(sketch), country FROM (SELECT hll_create_sketch(customer) AS sketch, country FROM Sales GROUP BY country) AS hll_subquery; hll_cardinality | country ----------------+--------- 1 | USA 2 | Greece ...
範例:從子查詢中的組合草圖傳回 HLLSKETCH 類型
下列範例會傳回單一 HLLSKETCH 類型,該類型代表子查詢中個別草圖的組合。草圖會使用 HLL_COMBINE 彙總函數進行組合。
SELECT hll_combine(sketch) FROM (SELECT hll_create_sketch(customer) AS sketch FROM Sales GROUP BY country) AS hll_subquery hll_combine -------------------------------------------------------------------------------------------- {"version":1,"logm":15,"sparse":{"indices":[29808639,35021072,47612452],"values":[1,1,1]}} (1 row)
範例:從合併多個草圖中傳回 HyperLogLog 草圖
在下列範例中,假設 page-users
資料表會針對使用者在指定網站上造訪的每個頁面儲存預先彙總的草圖。此資料表中的每一個資料列都包含一個 HyperLogLog 草圖,代表顯示所瀏覽過頁面的所有使用者 ID。
page_users -- +----------------+-------------+--------------+ -- | _PARTITIONTIME | page | sketch | -- +----------------+-------------+--------------+ -- | 2019-07-28 | homepage | CHAQkAQYA... | -- | 2019-07-28 | Product A | CHAQxPnYB... | -- +----------------+-------------+--------------+
下列範例會結合預先彙總的多個草圖並產生單一草圖。此草圖封裝了每個草圖封裝的集合基數。
SELECT hll_combine(sketch) as sketch FROM page_users
輸出結果類似如下。
-- +-----------------------------------------+ -- | sketch | -- +-----------------------------------------+ -- | CHAQ3sGoCxgCIAuCB4iAIBgTIBgqgIAgAwY.... | -- +-----------------------------------------+
建立新草圖時,您可以使用 HLL_CARDINALITY 函數來取得集合的不同值,如下所示。
SELECT hll_cardinality(sketch) FROM ( SELECT hll_combine(sketch) as sketch FROM page_users ) AS hll_subquery
輸出結果類似如下。
-- +-------+ -- | count | -- +-------+ -- | 54356 | -- +-------+
範例:使用外部資料表在 S3 資料上產生 HyperLogLog 草圖
下列範例會快取 HyperLogLog 草圖,以避免直接存取 Amazon S3 以進行基數估算。
您可以在定義用來保存 Amazon S3 資料的外部資料表中預先彙總和快取 HyperLogLog 草圖。透過這樣做,您可以在不存取基礎資料的情況下擷取基數估計值。
例如,假設您已將一組以 Tab 鍵分隔的文字檔卸載至 Amazon S3。您可以執行下列查詢,以定義 Amazon Redshift 外部結構描述 (名為 sales
) 中名為 spectrum
的外部資料表。此範例的 Amazon S3 儲存貯體位於美國東部 (維吉尼亞北部) AWS 區域。
create external table spectrum.sales( salesid integer, listid integer, sellerid smallint, buyerid smallint, eventid integer, dateid integer, qtysold integer, pricepaid decimal(8,2), commission decimal(8,2), saletime timestamp) row format delimited fields terminated by '\t' stored as textfile location 's3://redshift-downloads/tickit/spectrum/sales/';
假設您要計算在任意日期購買商品的不同買家。為此,下列範例會為一年中每一天的購買者 ID 產生草圖,並將結果儲存在 Amazon Redshift 資料表 hll_sales
中。
CREATE TABLE hll_sales AS SELECT saletime, hll_create_sketch(buyerid) AS sketch FROM spectrum.sales GROUP BY saletime; SELECT TOP 5 * FROM hll_sales;
輸出結果類似如下。
-- hll_sales -- | saletime | sketch | -- +-----------------+---------------------------------------------------------------------+ -- | 7/22/2008 8:30 | {"version":1,"logm":15,"sparse":{"indices":[9281416],"values":[1]}} -- | 2/19/2008 0:38 | {"version":1,"logm":15,"sparse":{"indices":[48735497],"values":[3]}} -- | 11/5/2008 4:49 | {"version":1,"logm":15,"sparse":{"indices":[27858661],"values":[1]}} -- | 10/27/2008 4:08 | {"version":1,"logm":15,"sparse":{"indices":[65295430],"values":[2]}} -- | 2/16/2008 9:37 | {"version":1,"logm":15,"sparse":{"indices":[56869618],"values":[2]}} -- +---------------- +---------------------------------------------------------------------+
下列查詢顯示 2008 年感恩節後星期五期間購買項目的不同買方預估數量。
SELECT hll_cardinality(hll_combine(sketch)) as distinct_buyers FROM hll_sales WHERE trunc(saletime) = '2008-11-28';
輸出結果類似如下。
distinct_buyers --------------- 386
假設您想要取得特定日期範圍內購買商品的不同使用者數量。例如,可能是從感恩節後的星期五到下一個星期一。為了得到此結果,下列查詢會使用 hll_combine
彙總函數。此函數可避免重複計算在超過所選範圍一天時購買商品的買家。
SELECT hll_cardinality(hll_combine(sketch)) as distinct_buyers FROM hll_sales WHERE saletime BETWEEN '2008-11-28' AND '2008-12-01';
輸出結果類似如下。
distinct_buyers --------------- 1166
若要讓 hll_sales
資料表保持在最新狀態,請在每天結束時執行下列查詢。這樣做會根據今天購買商品的買家 ID 產生 HyperLogLog 草圖,並將其新增至 hll_sales
資料表中。
INSERT INTO hll_sales SELECT saletime, hll_create_sketch(buyerid) FROM spectrum.sales WHERE TRUNC(saletime) = to_char(GETDATE(), 'YYYY-MM-DD') GROUP BY saletime;