GoogleSQL for BigQuery 支持数据草图。数据草图是数据聚合的简洁汇总。它会捕获所有必要的信息,以提取聚合结果、继续数据聚合或与其他草图合并从而进行重新聚合。
使用草图计算指标比计算确切值便宜很多。如果计算速度太慢或需要过多的临时存储空间,请使用草图来减少查询时间和资源。
此外,计算基数(例如不同用户的数量)或分位数(例如访问时长中位数)通常只能通过对原始数据运行作业来实现,因为已聚合的数据无法再组合。
假设一个表包含以下数据:
产品 | 用户数量 | 访问时长中位数 |
---|---|---|
产品 A | 5 亿 | 10 分钟 |
产品 B | 2000 万 | 2 分钟 |
我们无法计算这两个产品的用户总数,因为我们不知道表中有多少用户同时使用了两个产品。
一种解决方案是改为将草图存储在表中。每个草图是特定输入属性(例如基数)的近似和紧凑表示,您可以存储、合并(或重新聚合)和查询接近精确的结果。在前面的示例中,您可以通过创建并合并(重新聚合)每个产品的草图来估算产品 A 和产品 B 的不同用户的数量。您还可以使用同样可以合并和查询的分位数草图来估算访问时长中位数。
由于草图是原始数据的有损压缩,因此会引入一个以误差范围或置信区间 (CI) 表示的统计误差。对于大多数应用而言,这种不确定性很小。例如,一个典型的基数计数草图的相对误差为所有案例的 95% 的 1%。草图会牺牲一些准确率或精确率,以换取更快、更便宜的计算以及更少的存储空间。
简而言之,草图具有以下主要属性:
- 表示特定指标的近似聚合
- 紧凑
- 是内存中次线性数据结构的序列化形式
- 通常具有固定大小,并且渐近地小于输入
- 可能会引入您通过精确级别确定的统计错误
- 可与其他草图合并,以汇总底层数据集的并集
通过草图合并进行重新聚合
借助草图,您可以存储和合并数据,以便高效地进行重新聚合。这使得草图对数据集的具体化视图特别有用。您可以合并草图,以便根据为每个数据流创建的部分草图构建多个数据流的汇总。
例如,如果您为每天估算的不同用户数创建一个草图,您可以通过合并每日草图来获得过去 7 天的不同用户数。重新聚合已合并的每日草图有助于避免读取数据集的完整输入。
草图重新聚合在在线分析处理 (OLAP) 中也很有用。您可以合并草图,以创建 OLAP 立方体的总览,其中草图汇总了立方体的一个或多个特定维度的数据。真正不同的计数无法实现 OLAP 总览。
Sketch 集成
您可以将草图与其他系统集成。例如,您可以在外部应用(如 Dataflow 或 Apache Spark)中构建草图,并在 GoogleSQL 中使用它们,反之亦然。
除了 GoogleSQL 之外,您还可以使用采用以下编程语言的草图:
- C++
- Go
- Java
- Python
估算没有删除项的基数
如果您需要估算基数,并且不需要从草图中删除项,请使用 HLL++ 草图。
例如,如需获取在给定月份中主动使用产品的唯一身份用户数量(MAU 或 28DAU 指标),请使用 HLL++ 草图。
HLL++ 草图
HyperLogLog++ (HLL++) 是用于估算基数的草图算法。HLL++ 基于《HyperLogLog 实践》白皮书,其中 ++ 表示对 HyperLogLog 算法进行的增强。
基数是草图输入中的不同元素的数量。例如,您可以使用 HLL++ 草图来获取打开应用的唯一身份用户数量。
HLL++ 估算极小和极大的基数。HLL++ 包括一个 64 位哈希函数、用于减少较小基数估计值内存要求的稀疏表示法,以及用于较小基数估计值的经验偏差校正。
HLL++ 草图支持自定义精度。下表展示了支持的精确率值、最大存储空间大小以及典型精确率级别的置信区间 (CI):
精确率 | 存储空间大小上限 | 65% CI | 95% CI | 99% CI |
---|---|---|---|---|
10 | 1 KiB + 28 B | ±3.25% | ±6.50% | ±9.75% |
11 | 2 KiB + 28 B | ±2.30% | ±4.60% | ±6.89% |
12 | 4 KiB + 28 B | ±1.63% | ±3.25% | ±4.88% |
13 | 8 KiB + 28 B | ±1.15% | ±2.30% | ±3.45% |
14 | 16 KiB + 30 B | ±0.81% | ±1.63% | ±2.44% |
15(默认) | 32 KiB + 30 B | ±0.57% | ±1.15% | ±1.72% |
16 | 64 KiB + 30 B | ±0.41% | ±0.81% | ±1.22% |
17 | 128 KiB + 30 B | ±0.29% | ±0.57% | ±0.86% |
18 | 256 KiB + 30 B | ±0.20% | ±0.41% | ±0.61% |
19 | 512 KiB + 30 B | ±0.14% | ±0.29% | ±0.43% |
20 | 1024 KiB + 30 B | ±0.10% | ±0.20% | ±0.30% |
21 | 2048 KiB + 32 B | ±0.07% | ±0.14% | ±0.22% |
22 | 4096 KiB + 32 B | ±0.05% | ±0.10% | ±0.15% |
23 | 8192 KiB + 32 B | ±0.04% | ±0.07% | ±0.11% |
24 | 16384 KiB + 32 B | ±0.03% | ±0.05% | ±0.08% |
您可以在使用 HLL_COUNT.INIT
函数初始化 HLL++ 草图时定义精确率。
您不能从 HLL++ 草图中删除值。
如需查看可与 HLL++ 草图结合使用的函数列表,请参阅 HLL++ 函数。
近似聚合函数
作为基于草图的近似函数的特定 HLL++、D3A 或 KLL 函数的替代方案,GoogleSQL 提供了预定义的近似聚合函数。这些近似聚合函数支持常见估算(例如不同计数、分位数和顶部计数)的草图,但不允许使用自定义精确率。与其他类型的草图一样,它们也不会公开并存储草图以用于重新聚合。近似聚合函数旨在运行基于草图的快速查询,而无需进行详细配置。
如需查看可与基于草图的近似函数结合使用的近似聚合函数列表,请参阅近似聚合函数。