uniqCombined64
计算不同参数值的近似数量。它与 uniqCombined 相同,但对所有数据类型使用 64 位哈希,而不仅仅是对 String 数据类型使用。
uniqCombined64(HLL_precision)(x[, ...])
参数
HLL_precision
: HyperLogLog 中单元格数量的以 2 为底的对数。可以选择使用函数uniqCombined64(x[, ...])
。HLL_precision
的默认值为 17,实际上是 96 KiB 的空间 (2^17 个单元格,每个单元格 6 位)。X
: 可变数量的参数。参数可以是Tuple
、Array
、Date
、DateTime
、String
或数值类型。
返回值
- 一个 UInt64 类型数字。
实现细节
uniqCombined64
函数
- 对聚合中的所有参数计算哈希值 (对所有数据类型使用 64 位哈希),然后将其用于计算。
- 使用三种算法的组合:数组、哈希表和 HyperLogLog,以及错误校正表。
- 对于少量不同元素,使用数组。
- 当集合大小更大时,使用哈希表。
- 对于大量元素,使用 HyperLogLog,它将占用固定数量的内存。
- 以确定性方式提供结果(它不依赖于查询处理顺序)。
注意
由于它对所有类型使用 64 位哈希,因此结果不会像 uniqCombined 那样,在基数远大于 UINT_MAX
时出现非常高的误差,因为它对非 String
类型使用 32 位哈希。
与 uniq 函数相比,uniqCombined64
函数
- 消耗的内存少很多倍。
- 计算的准确性高很多倍。
示例
在下面的示例中,uniqCombined64
在 1e10
个不同的数字上运行,返回不同参数值的非常接近的近似值。
查询
SELECT uniqCombined64(number) FROM numbers(1e10);
结果
┌─uniqCombined64(number)─┐
│ 9998568925 │ -- 10.00 billion
└────────────────────────┘
相比之下,uniqCombined
函数对于这种大小的输入返回的近似值非常糟糕。
查询
SELECT uniqCombined(number) FROM numbers(1e10);
结果
┌─uniqCombined(number)─┐
│ 5545308725 │ -- 5.55 billion
└──────────────────────┘
另请参阅