ユーザー定義集計関数(UDA)の作成
ユーザー定義集計(UDA)を使用すると、複数のデータ行に格納されているデータを操作できます。返された結果は最後の関数によってさらに操作されます。
DataStax Enterprise 5.0以降では、クエリー結果の一部としてテーブルに格納されたデータに適用する集計関数を定義できます。この集計関数は、SELECT文で使用する前に作成する必要があるほか、クエリーにはその集計関数のみを含め、カラムは含めません。状態関数は各行に対して一度呼び出され、返された値が新しい状態になります。すべての行が処理されると、最終の状態値を引数としたオプションの最後の関数が実行されます。集計はコーディネーターによって実行されます。
ここに示した例では、テーブルに格納されたすべてのサイクリストのレース時間のチーム平均を計算します。レース時間は秒で計算されます。
手順
-
必要に応じて、状態関数をユーザー定義関数(UDF)として作成します。この関数は、すべてのレース時間を加算してエントリーの数をカウントします。
CREATE OR REPLACE FUNCTION avgState ( state tuple<int,bigint>, val int ) CALLED ON NULL INPUT RETURNS tuple<int,bigint> LANGUAGE java AS 'if (val !=null) { state.setInt(0, state.getInt(0)+1); state.setLong(1, state.getLong(1)+val.intValue()); } return state;';
-
必要に応じて、最後の関数をユーザー定義関数(UDF)として作成します。この関数は、状態関数からそれに渡された値の平均を計算します。
CREATE OR REPLACE FUNCTION avgFinal ( state tuple<int,bigint> ) CALLED ON NULL INPUT RETURNS double LANGUAGE java AS 'double r = 0; if (state.getInt(0) == 0) return null; r = state.getLong(1); r/= state.getInt(0); return Double.valueOf(r);';
-
これらの2つの関数を使用して集計関数を作成し、
STYPE
を追加してこの関数のデータ型を定義します。関数は、異なるSTYPE
によって同じ名前の別の関数と区別されます。上の例に示したようにOR REPLACE
を使用すると、ある集計を別の集計で置き換えることができます。キースペースに同じシグネチャーを持つ別の集計が存在しない場合に限り、オプションでIF NOT EXISTS
キーワードを使用して集計を作成することができます。OR REPLACE
とIF NOT EXISTS
は同じコマンドで使用できません。CREATE AGGREGATE IF NOT EXISTS average ( int ) SFUNC avgState STYPE tuple<int,bigint> FINALFUNC avgFinal INITCOND (0,0);