简介

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

该估计使用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 中编辑此页面