hyperloglog()和 approx_count_distinct()函数
工具包TimescaleDB 工具包函数在 Timescale 社区版下可用。它们会自动包含在 Timescale 中,但必须为自托管 TimescaleDB 单独安装。点击了解更多。简介
估计数据集中不同值的个数。这也被称为基数估计。对于大型数据集和基数较高的数据集(许多不同的值),这在 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
,但它会设置一个应该适用于许多用例的默认桶值。
必需参数
名称 | 类型 | 描述 |
---|---|---|
buckets | INTEGER | hyperloglog 中的桶数。增加桶数可以提高准确性,但会增加内存使用量。值将四舍五入到下一个 2 的幂,并且必须介于 2^4 (16) 和 2^18 之间。如果设置的值小于 2^10 (1,024),则如果真实基数很高,则可能会导致精度下降,不建议这样做。如果你不确定,请从 8,192 (2^13) 开始实验,它的大致误差率为 1.15%。 |
value | AnyElement | 包含要计数的元素的列。该类型必须具有扩展的 64 位哈希函数。 |
返回值
列 | 类型 | 描述 |
---|---|---|
hyperloglog | Hyperloglog | 一个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()
在应用访问器之前将多个这样的中间聚合对象组合起来。
必需参数
名称 | 类型 | 描述 |
---|---|---|
value | AnyElement | 包含要计数的元素的列。该类型必须具有扩展的 64 位哈希函数。 |
返回值
列 | 类型 | 描述 |
---|---|---|
hyperloglog | Hyperloglog | 一个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 估计不同值的个数
必需参数
名称 | 类型 | 描述 |
---|---|---|
hyperloglog | Hyperloglog | 要从中提取计数的 hyperloglog。 |
返回值
列 | 类型 | 描述 |
---|---|---|
distinct_count | BIGINT | hyperloglog 统计的不同元素个数。 |
示例
从名为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
的相对标准误差。有关桶数的近似相对误差,请参阅相对误差部分。
必需参数
名称 | 类型 | 描述 |
---|---|---|
hyperloglog | Hyperloglog | 要估计其误差的 hyperloglog。 |
返回值
列 | 类型 | 描述 |
---|---|---|
stderror | DOUBLE PRECISION | hyperloglog 的近似相对标准误差。 |
示例
估计名为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 组合到每日桶中。
必需参数
名称 | 类型 | 描述 |
---|---|---|
hyperloglog | Hyperloglog | 要汇总的 hyperloglog 聚合。 |
返回值
列 | 类型 | 描述 |
---|---|---|
rollup | Hyperloglog | 通过组合输入 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
这些是每个桶大小的大致误差
精度 | 寄存器(桶大小) | 误差 | 列大小(以字节为单位) |
---|---|---|---|
4 | 16 | 0.2600 | 12 |
5 | 32 | 0.1838 | 24 |
6 | 64 | 0.1300 | 48 |
7 | 128 | 0.0919 | 96 |
8 | 256 | 0.0650 | 192 |
9 | 512 | 0.0460 | 384 |
10 | 1024 | 0.0325 | 768 |
11 | 2048 | 0.0230 | 1536 |
12 | 4096 | 0.0163 | 3072 |
13 | 8192 | 0.0115 | 6144 |
14 | 16384 | 0.0081 | 12288 |
15 | 32768 | 0.0057 | 24576 |
16 | 65536 | 0.0041 | 49152 |
17 | 131072 | 0.0029 | 98304 |
18 | 262144 | 0.0020 | 196608 |
关键词
在该页面上发现问题?报告问题 或 在 GitHub 中编辑此页面。