APPROX_COUNT_DISTINCT 関数は、指定された列における重複のない値の個数を近似値で返します。この関数は、集約ノードにおける状態(state)のオーバーヘッドを大幅に削減するために、わずかで設定可能な精度の低下を許容する設計です。そのため、正確なカウントが必須でないユースケース(例:ユニーク訪問者(UV)数のカウント)において、高カーディナリティのデータ処理に最適です。
バージョン要件: Ververica Runtime (VVR) 3.0.0 以降。
使用するタイミング
以下の 2 つの条件がともに満たされる場合に限り、APPROX_COUNT_DISTINCT を COUNT DISTINCT の代わりに使用してください。
対象列の重複のないキー数(例:ユーザー ID、セッショントークン、URL)が非常に多い場合。低カーディナリティの列では、本関数によるパフォーマンス向上効果は得られません。
入力ストリームにリトラクトメッセージが含まれていない場合。
いずれかの条件が満たされない場合は、代わりに COUNT DISTINCT を使用してください。
仕組み
COUNT DISTINCT は、正確な結果を得るために、すべての重複のないキーを状態データに保存する必要があります。高カーディナリティの列では、この処理により読み取り/書き込みのオーバーヘッドが著しく増大し、パフォーマンスボトルネックとなります。
APPROX_COUNT_DISTINCT は、すべてのキーを保存せずに重複のない値の個数を推定します。これにより状態に関するボトルネックが解消され、集約ノード上でミニバッチおよびローカル・グローバル最適化が有効になります。
accuracy パラメーターは、計算精度を制御します。値が大きいほど精度が高くなりますが、その分状態のオーバーヘッドも増加し、COUNT DISTINCT に対するパフォーマンス優位性が弱まります。
構文
APPROX_COUNT_DISTINCT(col [, accuracy])パラメーター
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
col | すべてのデータの型 | はい | 重複のない値の個数をカウントする対象の列です。 |
accuracy | FLOAT | いいえ | 計算精度を指定します。有効範囲: (0.0, 1.0)。デフォルト値: 0.99。値が大きいほど精度は向上しますが、状態のオーバーヘッドも増加し、COUNT DISTINCT に対するパフォーマンス優位性が低下します。 |
例
以下の例では、デフォルト精度(0.99)と低い精度(0.9)で得られる結果を比較しています。
入力テーブル T1
| a (VARCHAR) | b (BIGINT) |
|---|---|
| Hi | 1 |
| Hi | 2 |
| Hi | 3 |
| Hi | 4 |
| Hi | 5 |
| Hi | 6 |
| Hello | 1 |
| Hello | 2 |
| Hello | 3 |
| Hello | 4 |
クエリ
SELECT
a,
APPROX_COUNT_DISTINCT(b) AS b,
APPROX_COUNT_DISTINCT(b, 0.9) AS c
FROM T1
GROUP BY a;実行結果
| a (VARCHAR) | b (BIGINT) | c (BIGINT) |
|---|---|---|
| Hi | 6 | 6 |
| Hello | 4 | 4 |
列 b はデフォルト精度 0.99 を使用し、列 c は精度 0.9 を使用しています。