分位数摘要函数¶
Presto 实现两种用于估计基于排名的指标的算法:分位数摘要 和 T-digest。T-digest 通常具有 更好的性能,而 Presto 的分位数摘要实现支持更多数值类型。T-digest 在尾部具有更高的精度,通常好得多,但在中位数处的精度可能较差,具体取决于所使用的压缩因子。相比之下,分位数摘要支持最大秩误差,这保证了沿着分位数的精度相对均匀。分位数摘要也有正式证明支持无损合并,而 T-digest 则没有(但实际上证明了无损合并)。
Presto 使用分位数摘要数据结构实现了 approx_percentile
函数。底层数据结构,qdigest,在 Presto 中作为一个数据类型公开,并且可以在 approx_percentile
之外单独创建、查询和存储。
数据结构¶
分位数摘要是一种数据草图,存储近似百分位数信息。Presto 的这种数据结构的类型称为 qdigest
,它接受一个参数,该参数必须是 bigint
、double
或 real
之一,它们代表可以被 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
和最大误差accuracy
。accuracy
必须是一个大于零且小于一的数值,并且对于所有输入行必须是恒定的。