T-Digest 函数

Presto 实现两种用于估计基于秩的指标的算法,分位数摘要T-Digest。T-Digest 通常具有 更好的性能,而 Presto 中的分位数摘要实现支持更多数值类型。T-Digest 在尾部具有更好的精度,通常显著好于分位数摘要,但在中位数处的精度可能较差,具体取决于使用的压缩因子。相比之下,分位数摘要支持最大秩误差,这保证了在分位数中精度相对一致。分位数摘要也被正式证明支持无损合并,而 T-Digest 则不支持(但经验性地证明了无损合并)。

T-Digest 由 Ted Dunning 开发。

数据结构

T-Digest 是一种数据草图,用于存储近似百分位信息。Presto 的这种数据结构的类型称为 tdigest,它接受一个类型为 double 的参数,表示要被 tdigest 吸收的数字集。其他数值类型可能在将来的版本中添加。

T-Digest 可以合并而不会损失精度,并且可以转换为/从 VARBINARY 转换,以便存储和检索。

函数

merge(tdigest<double>) -> tdigest<double>()

将所有输入 tdigest 合并到单个 tdigest 中。

value_at_quantile(tdigest<double>, quantile) -> double()

根据 0 到 1 之间的数字 quantile,从 T-Digest 返回近似百分位值。

quantile_at_value(tdigest<double>, value) -> double()

根据输入 value,从 T-Digest 返回 0 到 1 之间的近似分位数数字。如果 T-Digest 为空或输入值超出摘要范围,则返回 Null。

scale_tdigest(tdigest<double>, scale_factor) -> tdigest<double>()

返回一个 tdigest,其分布按 scale_factor 指定的因子进行缩放。

values_at_quantiles(tdigest<double>, quantiles) -> array<double>()

根据输入 T-Digest 和 0 到 1 之间的数组值(表示要返回的分位数),返回近似百分位值数组。

trimmed_mean(tdigest<double>, lower_quantile, upper_quantile) -> double()

返回对平均值的估计,排除在提供的分位数界限之外的分布部分。 lower_quantileupper_quantile 必须在 0 到 1 之间。

tdigest_agg(x) -> tdigest<double>()

返回由 x 的所有输入值组成的 tdigest

tdigest_agg(x, w) -> tdigest<double>()

返回由 x 的所有输入值组成的 tdigest,使用每个项目的权重 w

tdigest_agg(x, w, compression) -> tdigest<double>()

返回由 x 的所有输入值组成的 tdigest,使用每个项目的权重 w 和压缩因子 compressioncompression 必须大于零,并且对于所有输入行必须保持一致。

压缩因子 500 是一个良好的起点,通常会产生良好的精度和性能。

destructure_tdigest(tdigest<double>) -> row<centroid_means array<double>, centroid_weights array<integer>, compression double, min double, max double, sum double, count bigint>()

返回一个表示 tdigest 数据结构的行,以其组成部分的形式表示。这些部分包括质心均值和权重的数组、压缩因子以及摘要中值的最小值、最大值、总和和计数。

construct_tdigest(centroid_means array<double>, centroid_weights array<double>, compression double, min double, max double, sum double, count bigint) -> tdigest<double>()

从其组成部分(质心均值和权重的数组、压缩因子以及摘要中值的最小值、最大值、总和和计数)返回 tdigest。这是 destructure_tdigest 的逆运算。

此函数对于将外部创建的 tdigest 添加到 Presto 特别有用。

merge_tdigest(array<tdigest<double>>) -> tdigest<double>()
返回 一个 合并的 ``tdigest`` 包含 数组 中的 T-digests . 这是 聚合函数 ``merge`` ()
标量 补码 .()