分位数摘要函数

Presto 实现两种用于估计基于排名的指标的算法:分位数摘要T-digest。T-digest 通常具有 更好的性能,而 Presto 的分位数摘要实现支持更多数值类型。T-digest 在尾部具有更高的精度,通常好得多,但在中位数处的精度可能较差,具体取决于所使用的压缩因子。相比之下,分位数摘要支持最大秩误差,这保证了沿着分位数的精度相对均匀。分位数摘要也有正式证明支持无损合并,而 T-digest 则没有(但实际上证明了无损合并)。

Presto 使用分位数摘要数据结构实现了 approx_percentile 函数。底层数据结构,qdigest,在 Presto 中作为一个数据类型公开,并且可以在 approx_percentile 之外单独创建、查询和存储。

数据结构

分位数摘要是一种数据草图,存储近似百分位数信息。Presto 的这种数据结构的类型称为 qdigest,它接受一个参数,该参数必须是 bigintdoublereal 之一,它们代表可以被 qdigest 摄取的数字集。它们可以在不丢失精度的情况下合并,并且可以转换为/从 VARBINARY 转换以进行存储和检索。

函数

merge(qdigest) -> qdigest()

将所有输入 qdigest 合并为一个 qdigest

value_at_quantile(qdigest(T), quantile) -> T()

根据 0 到 1 之间的数字 quantile,从分位数摘要中返回近似百分位数。

quantile_at_value(qdigest(T), T) -> quantile()

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

scale_qdigest(qdigest(T), scale_factor) -> qdigest(T)

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

values_at_quantiles(qdigest(T), quantiles) -> T()

根据输入分位数摘要和表示要返回的分位数的 0 到 1 之间值的数组,返回作为数组的近似百分位数。

qdigest_agg(x) -> qdigest<[same as x]>()

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

qdigest_agg(x, w) -> qdigest<[same as x]>()

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

qdigest_agg(x, w, accuracy) -> qdigest<[same as x]>()

返回由 x 的所有输入值组成的 qdigest,使用每个项目的权重 w 和最大误差 accuracyaccuracy 必须是一个大于零且小于一的数值,并且对于所有输入行必须是恒定的。