最近更新时间:2023.06.07 10:05:58
首次发布时间:2022.12.19 15:11:00
计算参数的不同值的近似数量。
语法
uniq(x[, ...])
参数
该函数采用可变数量的参数。 参数可以是 Tuple
, Array
, Date
, DateTime
, String
, 或数字类型。
返回值
实现细节
功能:
计算聚合中所有参数的哈希值,然后在计算中使用它。
使用自适应采样算法。 对于计算状态,该函数使用最多65536个元素哈希值的样本。
这个算法是非常精确的,并且对于CPU来说非常高效。如果查询包含一些这样的函数,那和其他聚合函数相比 uniq
将是几乎一样快。
确定性地提供结果(它不依赖于查询处理顺序)。
我们建议在几乎所有情况下使用此功能。
计算不同参数值的近似数量。
语法
uniqCombined(HLL_precision)(x[, ...])
该 uniqCombined
函数是计算不同值数量的不错选择。
参数
该函数采用可变数量的参数。 参数可以是 Tuple
, Array
, Date
, DateTime
, String
,或数字类型。
HLL_precision
是以2为底的单元格数的对数 HyperLogLog。可选,您可以将该函数用作 uniqCombined(x[, ...])
。 HLL_precision
的默认值是17,这是有效的96KiB的空间(2^17个单元,每个6比特)。
返回值
实现细节
功能:
为聚合中的所有参数计算哈希(String
类型用64位哈希,其他32位),然后在计算中使用它。
使用三种算法的组合:数组、哈希表和包含错误修正表的HyperLogLog。
少量的不同的值,使用数组。 值再多一些,使用哈希表。对于大量的数据来说,使用HyperLogLog,HyperLogLog占用一个固定的内存空间。
确定性地提供结果(它不依赖于查询处理顺序)。
注意
由于它对非 String
类型使用32位哈希,对于基数显著大于UINT_MAX
,结果将有非常高的误差(误差将在几百亿不同值之后迅速提高), 因此这种情况,你应该使用 uniqCombined64。
相比于 uniq 函数, 该 uniqCombined
:
uniqCombined
可以表现得比 uniq
好,例如,使用通过网络传输大量聚合状态的分布式查询。和 uniqCombined 一样, 但对于所有数据类型使用64位哈希。
计算不同参数值的准确数目。
语法
uniqExact(x[, ...])
如果你绝对需要一个确切的结果,使用 uniqExact
函数。 否则使用 uniq 函数。
uniqExact
函数比 uniq
使用更多的内存,因为状态的大小随着不同值的数量的增加而无界增长。
参数
该函数采用可变数量的参数。 参数可以是 Tuple
, Array
, Date
, DateTime
, String
,或数字类型。
计算不同参数值的近似数量,使用 HyperLogLog 算法。
语法
uniqHLL12(x[, ...])
参数
该函数采用可变数量的参数。 参数可以是 Tuple
, Array
, Date
, DateTime
, String
,或数字类型。
返回值
实现细节
功能:
计算聚合中所有参数的哈希值,然后在计算中使用它。
使用 HyperLogLog 算法来近似不同参数值的数量。
使用2^12个5比特单元。 状态的大小略大于2.5KB。 对于小数据集(<10K元素),结果不是很准确(误差高达10%)。 但是, 对于高基数数据集(10K-100M),结果相当准确,最大误差约为1.6%。Starting from 100M, the estimation error increases, and the function will return very inaccurate results for data sets with extremely high cardinality (1B+ elements).
提供确定结果(它不依赖于查询处理顺序)。
我们不建议使用此函数。 在大多数情况下, 使用 uniq 或 uniqCombined 函数。