hyperloglog() 和 approx_count_distinct() 函数
工具包TimescaleDB 工具包函数在 Timescale Community Edition 下可用。它们自动包含在 Timescale 中,但对于自托管的 TimescaleDB 必须单独安装。点击了解更多。简介
估计数据集中的不同值的数量。这也称为基数估计。对于大型数据集和具有高基数(许多不同值)的数据集,与使用 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
,但它设置了一个默认桶值,该值应适用于许多用例。
必需参数
名称 | 类型 | 描述 |
---|---|---|
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 上编辑此页面。