すべてのプロダクト
Search
ドキュメントセンター

Realtime Compute for Apache Flink:APPROX_COUNT_DISTINCT

最終更新日:Mar 27, 2026

APPROX_COUNT_DISTINCT 関数は、指定された列における重複のない値の個数を近似値で返します。この関数は、集約ノードにおける状態(state)のオーバーヘッドを大幅に削減するために、わずかで設定可能な精度の低下を許容する設計です。そのため、正確なカウントが必須でないユースケース(例:ユニーク訪問者(UV)数のカウント)において、高カーディナリティのデータ処理に最適です。

バージョン要件: Ververica Runtime (VVR) 3.0.0 以降。

使用するタイミング

以下の 2 つの条件がともに満たされる場合に限り、APPROX_COUNT_DISTINCTCOUNT DISTINCT の代わりに使用してください。

  • 対象列の重複のないキー数(例:ユーザー ID、セッショントークン、URL)が非常に多い場合。低カーディナリティの列では、本関数によるパフォーマンス向上効果は得られません。

  • 入力ストリームにリトラクトメッセージが含まれていない場合。

いずれかの条件が満たされない場合は、代わりに COUNT DISTINCT を使用してください。

仕組み

COUNT DISTINCT は、正確な結果を得るために、すべての重複のないキーを状態データに保存する必要があります。高カーディナリティの列では、この処理により読み取り/書き込みのオーバーヘッドが著しく増大し、パフォーマンスボトルネックとなります。

APPROX_COUNT_DISTINCT は、すべてのキーを保存せずに重複のない値の個数を推定します。これにより状態に関するボトルネックが解消され、集約ノード上でミニバッチおよびローカル・グローバル最適化が有効になります。

accuracy パラメーターは、計算精度を制御します。値が大きいほど精度が高くなりますが、その分状態のオーバーヘッドも増加し、COUNT DISTINCT に対するパフォーマンス優位性が弱まります。

構文

APPROX_COUNT_DISTINCT(col [, accuracy])

パラメーター

パラメーター必須説明
colすべてのデータの型はい重複のない値の個数をカウントする対象の列です。
accuracyFLOATいいえ計算精度を指定します。有効範囲: (0.0, 1.0)。デフォルト値: 0.99。値が大きいほど精度は向上しますが、状態のオーバーヘッドも増加し、COUNT DISTINCT に対するパフォーマンス優位性が低下します。

以下の例では、デフォルト精度(0.99)と低い精度(0.9)で得られる結果を比較しています。

入力テーブル T1

a (VARCHAR)b (BIGINT)
Hi1
Hi2
Hi3
Hi4
Hi5
Hi6
Hello1
Hello2
Hello3
Hello4

クエリ

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)
Hi66
Hello44

b はデフォルト精度 0.99 を使用し、列 c は精度 0.9 を使用しています。