Upgrade to Pro — share decks privately, control downloads, hide ads and more …

t-digestアルゴリズム概要 - ストリームデータにおける近似分位点の計算

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

t-digestアルゴリズム概要 - ストリームデータにおける近似分位点の計算

ソフトウェア開発・運用の中でパーセンタイルを扱うことが多いと思いますが、そのパーセンタイル(分位点)ってどのようなアルゴリズムで計算されているかご存知でしょうか?

このデッキでは、Amazon Athena(Trinoクエリエンジン)にも実装されているt-digestアルゴリズムについて、その概要を紹介します。

Avatar for hiroshi ueda

hiroshi ueda

May 21, 2026

More Decks by hiroshi ueda

Other Decks in Technology

Transcript

  1. Trino / Athena での使い方 — 基本 tdigest_agg() でグループの集合を作り、 value_at_quantile() で分位数を取得する

    レスポンスタイムの p50 / p95 / p99 を計算 SELECT value_at_quantile(tdigest_agg(response_ms), 0.50) AS p50, value_at_quantile(tdigest_agg(response_ms), 0.95) AS p95, value_at_quantile(tdigest_agg(response_ms), 0.99) AS p99 FROM access_logs; tdigest_agg(column) カラムの全値からグループの集合を作成する 集約関数(GROUP BY と組み合わせ可) value_at_quantile(tdigest, q) グループの集合から分位数 q(0〜1)に 対応する近似値を返す
  2. t-digest は何をしているのか? 背景: 正確な分位数にはデータ数 N に比例するメモリが必要だが、ストリームではメモリに上限がある。近似で分位数を推定す るのが合理的 目的: データが来るたびにグループへ振り分けることで、少ないメモリで分位数を推定する 新しいデータが来たら、平均値との差が最も小さいグループを探す

    グループに余裕がある場合 そのグループに追加する → 平均値とデータ数を更新 例: (平均98, 25個) → (平均99, 26個) グループがいっぱいの場合 新しいグループを作る → データ1個だけのグループが誕生 「いっぱい」の基準はスケール関数が決める(後述)
  3. Trino / Athena での使い方 — 応用 事前にグループの集合を保存しておき、 merge() で結合して任意期間の分位数を高速に取得 日次でグループの集合を保存しておく

    CREATE TABLE daily_digest AS SELECT dt, CAST(tdigest_agg(val) AS VARBINARY) AS digest FROM metrics GROUP BY dt; 後から任意期間の分位数を高速に取得 SELECT value_at_quantile(merge(CAST(digest AS tdigest)), 0.99) AS p99 FROM daily_digest WHERE dt BETWEEN '2025-01-01' AND '2025-03-31'; merge() は保存済みのグループの集合を結合する関数。前述のマージ処理を SQL から呼び出せる