分位摘要函數¶
Presto 實作了兩種演算法來估算基於排名的度量,分位摘要和 T-摘要。 一般來說,T-摘要具有更好的效能,而 Presto 的分位摘要實作則支援更多數值類型。T-摘要在尾部的精確度較高,通常顯著較好,但根據使用的壓縮因子,在中位數的精確度可能會較差。相比之下,分位摘要支援最大排名誤差,這保證了沿分位數的精確度相對均勻。分位摘要也被正式證明支援無損合併,而 T-摘要則不是(但確實憑經驗證明了無損合併)。
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<[與 x 相同]>()¶
傳回由
x
的所有輸入值組成的qdigest
。
- qdigest_agg(x, w) -> qdigest<[與 x 相同]>()¶
傳回由
x
的所有輸入值組成的qdigest
,並使用每個項目的權重w
。
- qdigest_agg(x, w, accuracy) -> qdigest<[與 x 相同]>()¶
使用每個項目的權重
w
和最大誤差accuracy
,傳回由x
的所有輸入值組成的qdigest
。accuracy
必須是個大於零且小於一的值,且對於所有輸入列必須為常數。