标准 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 算法。

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面