uniqCombined
计算不同参数值的近似数量。
uniqCombined(HLL_precision)(x[, ...])
uniqCombined
函数是计算不同值数量的不错选择。
参数
HLL_precision
:HyperLogLog 中单元格数量的以 2 为底的对数。可选,您可以将函数用作uniqCombined(x[, ...])
。HLL_precision
的默认值为 17,这实际上是 96 KiB 的空间(2^17 个单元格,每个单元格 6 位)。X
:可变数量的参数。参数可以是Tuple
、Array
、Date
、DateTime
、String
或数字类型。
返回值
- 一个数字 UInt64 类型数字。
实现细节
uniqCombined
函数
- 为聚合中的所有参数计算哈希值(
String
类型为 64 位哈希,其他类型为 32 位哈希),然后将其用于计算。 - 使用三种算法的组合:数组、哈希表和带有错误校正表的 HyperLogLog。
- 对于少量不同的元素,使用数组。
- 当集合大小较大时,使用哈希表。
- 对于大量元素,使用 HyperLogLog,它将占用固定数量的内存。
- 确定性地提供结果(它不依赖于查询处理顺序)。
注意
由于它对非 String
类型使用 32 位哈希,因此对于远大于 UINT_MAX
的基数,结果将具有非常高的误差(在数十亿个不同的值之后,误差将迅速增加),因此在这种情况下,您应该使用 uniqCombined64。
与 uniq 函数相比,uniqCombined
函数
- 消耗的内存少得多。
- 计算精度高得多。
- 通常性能略低。在某些情况下,
uniqCombined
的性能可能优于uniq
,例如,在通过网络传输大量聚合状态的分布式查询中。
示例
查询
SELECT uniqCombined(number) FROM numbers(1e6);
结果
┌─uniqCombined(number)─┐
│ 1001148 │ -- 1.00 million
└──────────────────────┘
有关 uniqCombined
和 uniqCombined64
在更大输入下差异的示例,请参阅 uniqCombined64 的示例部分。
另请参阅