標準 SQL 中的近似匯總

本主題說明 BigQuery 中近似匯總背後的概念。

什麼是近似匯總?

近似匯總是匯總函式輸出的估計值,例如基數和分位數。與 COUNT(DISTINCT ...) 等一般匯總函式相比,近似匯總需要的記憶體較少,但也會產生統計上的不確定性。這使得它適用於線性記憶體用量不切實際的大型資料串流,以及已接近的資料。如果需要確切的結果,請使用確切的匯總函式。本主題說明 BigQuery 中近似匯總背後的概念。

固定精確度近似匯總

BigQuery 支援 具有固定精確度的匯總函式 ,以用於估計基數和分位數。這些函式會直接作用在輸入資料上,而非資料的中間估計值。這些函式不允許使用者指定估計值的精確度。

將預估的匯總值儲存為草圖

BigQuery 支援 HyperLogLog++ 基數估計函式 ,以用於估計大型資料集中的相異值數目。

這些函式會針對草圖進行運算,將任意集合壓縮成固定記憶體表示法。BigQuery 會將這些草圖儲存為 BYTES。 在從草圖擷取最終數值估計值之前,您可以合併草圖以產生代表輸入草圖聯集的新草圖。

例如,請看下表,其中包含冰淇淋口味和聲稱喜歡該口味的人數:

口味 人數
香草 3945
巧克力 1728
草莓 2051

如果這個資料表是匯總的結果,則可能無法使用該資料表來計算基數。如果想要知道不重複受訪者的人數,您無法使用 SUM 來匯總「People」 欄,因為有些受訪者可能會對多種口味做出正面回應。另一方面,對基礎原始資料執行匯總函式可能會耗用大量時間和記憶體。

有一個解決方法是儲存原始資料的近似匯總或草圖。草圖是原始資料的摘要。草圖需要的記憶體比原始資料少,而且您可以從草圖擷取估計值,例如預估的不重複使用者數目。

指定近似精確度

BigQuery 以草圖為基礎的近似匯總函式,可讓您在建立草圖時指定其精確度。草圖的精確度會影響您能從草圖擷取之估計值的準確度。較高的精確度需要額外的記憶體來處理草圖或將草圖儲存在磁碟上,並減少從草圖擷取之任何估計值的相對誤差。建立草圖後,您只能將它與其他具有相同精確度的草圖合併。

合併草圖

您可以合併兩個以上的草圖以產生新的草圖,新的草圖代表不同草圖基礎資料之聯集的估計值。合併函式 (例如 HLL_COUNT.MERGE) 會以數字的形式傳回估計值,而部分合併函式 (例如 HLL_COUNT.MERGE_PARTIAL) 會以 BYTES 的形式傳回新的草圖。如果您想要縮減已包含草圖但還不想要擷取估計值的資料表,則可以使用部分合併。例如,如果您想要建立一個稍後將與另一個草圖合併的草圖,請使用此函式。

從草圖擷取估計值

儲存草圖或將兩個以上的草圖合併至新的草圖後,您可以使用擷取函式 (例如 HLL_COUNT.EXTRACT ) 來以數字的形式傳回基礎資料的估計值 (例如不重複使用者的預估數目)。

演算法

本節將說明 BigQuery 支援的近似匯總演算法。

HyperLogLog++

HyperLogLog++ 演算法是 HyperLogLog 演算法的改良版本,用於估計資料集內的相異值。在 BigQuery 中,HyperLogLog++ 基數估計函式會使用此演算法。HyperLogLog++ 演算法透過使用偏差修正來改進 HyperLogLog 演算法,以減少重要基數範圍的誤差。

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁