You need to enable JavaScript to run this app.
导航

Uniq

最近更新时间2023.06.07 10:05:58

首次发布时间2022.12.19 15:11:00

uniq

计算参数的不同值的近似数量。

语法

uniq(x[, ...])

参数

该函数采用可变数量的参数。 参数可以是 Tuple, Array, Date, DateTime, String, 或数字类型。

返回值

  • UInt64 类型数值。

实现细节

功能:

  • 计算聚合中所有参数的哈希值,然后在计算中使用它。

  • 使用自适应采样算法。 对于计算状态,该函数使用最多65536个元素哈希值的样本。

    这个算法是非常精确的,并且对于CPU来说非常高效。如果查询包含一些这样的函数,那和其他聚合函数相比 uniq 将是几乎一样快。

  • 确定性地提供结果(它不依赖于查询处理顺序)。

我们建议在几乎所有情况下使用此功能。


toc_priority: 192

uniqCombined {#agg_function-uniqcombined}

计算不同参数值的近似数量。

语法

uniqCombined(HLL_precision)(x[, ...])

uniqCombined 函数是计算不同值数量的不错选择。

参数

该函数采用可变数量的参数。 参数可以是 Tuple, Array, Date, DateTime, String,或数字类型。

HLL_precision 是以2为底的单元格数的对数 HyperLogLog。可选,您可以将该函数用作 uniqCombined(x[, ...])HLL_precision 的默认值是17,这是有效的96KiB的空间(2^17个单元,每个6比特)。

返回值

  • 一个 UInt64 类型的数字。

实现细节

功能:

  • 为聚合中的所有参数计算哈希(String类型用64位哈希,其他32位),然后在计算中使用它。

  • 使用三种算法的组合:数组、哈希表和包含错误修正表的HyperLogLog。

    少量的不同的值,使用数组。 值再多一些,使用哈希表。对于大量的数据来说,使用HyperLogLog,HyperLogLog占用一个固定的内存空间。

  • 确定性地提供结果(它不依赖于查询处理顺序)。

注意

由于它对非 String 类型使用32位哈希,对于基数显著大于UINT_MAX ,结果将有非常高的误差(误差将在几百亿不同值之后迅速提高), 因此这种情况,你应该使用 uniqCombined64。

相比于 uniq 函数, 该 uniqCombined:

  • 消耗内存要少几倍。
  • 计算精度高出几倍。
  • 通常具有略低的性能。 在某些情况下, uniqCombined 可以表现得比 uniq 好,例如,使用通过网络传输大量聚合状态的分布式查询。
uniqCombined64

和 uniqCombined 一样, 但对于所有数据类型使用64位哈希。

uniqExact

计算不同参数值的准确数目。

语法

uniqExact(x[, ...])

如果你绝对需要一个确切的结果,使用 uniqExact 函数。 否则使用 uniq 函数。

uniqExact 函数比 uniq 使用更多的内存,因为状态的大小随着不同值的数量的增加而无界增长。

参数

该函数采用可变数量的参数。 参数可以是 Tuple, Array, Date, DateTime, String,或数字类型。

uniqHLL12

计算不同参数值的近似数量,使用 HyperLogLog 算法。

语法

uniqHLL12(x[, ...])

参数

该函数采用可变数量的参数。 参数可以是 Tuple, Array, Date, DateTime, String,或数字类型。

返回值

  • 一个UInt64类型的数字。

实现细节

功能:

  • 计算聚合中所有参数的哈希值,然后在计算中使用它。

  • 使用 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 函数。