简介

估计数据集中的不同值的数量。这也称为基数估计。对于大型数据集和具有高基数(许多不同值)的数据集,与使用 count(DISTINCT) 进行精确计数相比,这在 CPU 和内存方面都可能高效得多。

该估计使用 hyperloglog++ 算法。如果您不确定为 hyperloglog 设置哪些参数,请尝试使用 approx_count_distinct 聚合,它设置了一些合理的默认值。

聚合

hyperloglog
将数据聚合到 hyperloglog 中以进行近似计数

备用聚合

approx_count_distinct
将数据聚合到 hyperloglog 中以进行近似计数,而无需指定桶的数量

访问器

distinct_count
从 hyperloglog 估计不同值的数量
stderror
估计 hyperloglog 的相对标准误差

汇总

rollup
汇总多个 hyperloglog
hyperloglog(
buckets INTEGER,
value AnyElement
) RETURNS Hyperloglog

这是使用 hyperloglog 算法估计不同值的近似数量的第一步。使用 hyperloglog 从原始数据创建中间聚合。然后,此中间形式可以被该组中的一个或多个访问器使用,以计算最终结果。

可选地,可以使用 rollup() 组合多个此类中间聚合对象,然后再应用访问器。

如果您不确定为 buckets 设置什么值,请尝试使用备用聚合函数 approx_count_distinct()approx_count_distinct 也创建 hyperloglog,但它设置了一个默认桶值,该值应适用于许多用例。

必需参数
名称类型描述
bucketsINTEGERhyperloglog 中的桶数。增加桶数可以提高准确性,但会增加内存使用量。值向上舍入到下一个 2 的幂,并且必须介于 2^4 (16) 和 2^18 之间。如果真实基数很高,则设置小于 2^10 (1,024) 的值可能会导致较差的准确性,不建议这样做。如果不确定,请从 8,192 (2^13) 开始试验,其近似误差率为 1.15%。
valueAnyElement包含要计数的元素的列。该类型必须具有扩展的 64 位哈希函数。
返回值
类型描述
hyperloglogHyperloglog一个 hyperloglog 对象,可以将其传递给其他 hyperloglog API 以进行汇总和最终计算
示例

给定一个名为 samples 的表,其中有一列名为 weights,返回 weights 列上的 hyperloglog

SELECT hyperloglog(32768, weights) FROM samples;

使用相同的数据,从聚合构建一个视图,您可以将其传递给其他 hyperloglog 函数

CREATE VIEW hll AS SELECT hyperloglog(32768, data) FROM samples;
approx_count_distinct(
value AnyElement
) RETURNS Hyperloglog

这是近似不同值数量的备用第一步。它通过使用一些合理的默认参数来创建 hyperloglog,从而提供了一些额外的便利。

使用 approx_count_distinct 从原始数据创建中间聚合。然后,此中间形式可以被该组中的一个或多个访问器使用,以计算最终结果。

可选地,可以使用 rollup() 组合多个此类中间聚合对象,然后再应用访问器。

必需参数
名称类型描述
valueAnyElement包含要计数的元素的列。该类型必须具有扩展的 64 位哈希函数。
返回值
类型描述
hyperloglogHyperloglog一个 hyperloglog 对象,可以将其传递给其他 hyperloglog API 以进行汇总和最终计算
示例

给定一个名为 samples 的表,其中有一列名为 weights,返回 weights 列上的 hyperloglog

SELECT toolkit_experimental.approx_count_distinct(weights) FROM samples;

使用相同的数据,从聚合构建一个视图,您可以将其传递给其他 hyperloglog 函数

CREATE VIEW hll AS SELECT toolkit_experimental.approx_count_distinct(data) FROM samples;
distinct_count(
hyperloglog Hyperloglog
) RETURNS BIGINT

从 hyperloglog 估计不同值的数量

必需参数
名称类型描述
hyperloglogHyperloglog从中提取计数的 hyperloglog。
返回值
类型描述
distinct_countBIGINThyperloglog 计数的不同元素的数量。
示例

从名为 hyperloglog 的 hyperloglog 估计不同值的数量。预期输出为 98,814

SELECT distinct_count(hyperloglog(8192, data))
FROM generate_series(1, 100000) data
distinct_count
----------------
98814
stderror(
hyperloglog Hyperloglog
) RETURNS DOUBLE PRECISION

估计 Hyperloglog 的相对标准误差。有关按桶数计算的近似相对误差,请参阅相对误差部分

必需参数
名称类型描述
hyperloglogHyperloglog要估计误差的 hyperloglog。
返回值
类型描述
stderrorDOUBLE PRECISIONhyperloglog 的近似相对标准误差。
示例

估计名为 hyperloglog 的 hyperloglog 的相对标准误差。预期输出为 0.011490485194281396

SELECT stderror(hyperloglog(8192, data))
FROM generate_series(1, 100000) data
stderror
----------------------
0.011490485194281396
rollup(
hyperloglog Hyperloglog
) RETURNS Hyperloglog

将由 hyperloglog 生成的多个中间 hyperloglog 聚合组合成单个中间 hyperloglog 聚合。例如,您可以使用 rollup 将来自 15 分钟桶的 hyperloglog 组合成每日桶。

必需参数
名称类型描述
hyperloglogHyperloglog要汇总的 hyperloglog 聚合。
返回值
类型描述
rollupHyperloglog通过组合输入 hyperloglog 聚合创建的新 hyperloglog 聚合。

汇总两个 hyperloglog。第一个 hyperloglog 对从 1 到 100,000 的整数进行分桶,第二个 hyperloglog 对从 50,000 到 150,000 的整数进行分桶。考虑到重叠,合并集中不同值的精确数量为 150,000。

在汇总的 hyperloglog 上调用 distinct_count 会产生最终值 150,552,因此近似值仅偏差 0.368%

SELECT distinct_count(rollup(logs))
FROM (
(SELECT hyperloglog(4096, v::text) logs FROM generate_series(1, 100000) v)
UNION ALL
(SELECT hyperloglog(4096, v::text) FROM generate_series(50000, 150000) v)
) hll;

输出

distinct_count
----------------
150552

这些是每个桶大小的近似误差

精度寄存器(桶大小)误差列大小(字节)
4160.260012
5320.183824
6640.130048
71280.091996
82560.0650192
95120.0460384
1010240.0325768
1120480.02301536
1240960.01633072
1381920.01156144
14163840.008112288
15327680.005724576
16655360.004149152
171310720.002998304
182621440.0020196608

关键词

在此页面上发现问题?报告问题 或 在 GitHub 上编辑此页面