CREATE AGGREGATE

ユーザー定義集計を定義します。

ユーザー定義集計を定義します。集計では、選択したデータ・セットの各行でユーザー定義関数(UDF)を実行し、必要に応じて最後のUDFを結果セットで実行して、単一値(平均や標準偏差など)を返します。

構文

CREATE [ OR REPLACE ] AGGREGATE [ IF NOT EXISTS ] 
  [keyspace_name.]aggregate_name (cql_type)
  SFUNC udf_name 
  STYPE cql_type
  FINALFUNC udf_name 
  INITCOND init_value
  [ DETERMINISTIC ] ;
1. 凡例
構文規則 説明
大文字 リテラル・キーワード。
小文字 リテラル以外。
イタリック体 変数値。ユーザー定義値と置き換えます。
[] 任意。角かっこ( [] )で任意指定のコマンド引数を囲みます。角かっこは入力しないでください。
( ) グループ。丸かっこ(( ))は、選択肢を含むグループを示します。丸かっこは入力しないでください。
| または。縦棒( | )で代替要素を区切ります。要素のいずれかを入力してください。縦棒は入力しないでください。
... 繰り返し可能。省略記号(...)は、構文要素を必要な回数だけ繰り返すことができることを示します。
'Literal string' 単一引用符( ' )でCQL文内のリテラル文字を囲みます。大文字を維持するには、単一引用符を使用します。
{ key : value } マップ・コレクション。中かっこ( { } )でマップ・コレクションまたはキーと値のペアを囲みます。コロンでキーと値を区切ります。
<datatype1,datatype2> セット、リスト、マップ、またはタプル。山かっこ(< >)で、セット、リスト、マップまたはタプル内のデータ型を囲みます。データ型はコンマで区切ります。
cql_statement; CQL文の終了。セミコロン( ; )ですべてのCQL文を終了します。
[--] コマンドライン・オプションとコマンド引数は、2つのハイフン(--)。この構文は、引数がコマンドライン・オプションと間違われる可能性がある場合に役立ちます。
' <schema> ... </schema> ' 検索CQLのみ:単一引用符( ' )でXMLスキーマ宣言全体を囲みます。
@xml_entity='xml_entity_type' 検索CQLのみ:スキーマ・ファイルおよびsolrConfigファイル内のXML要素を上書きするための実体とリテラル値を示します。
OR REPLACE
名前が同じ既存の集計を上書きします。OR REPLACEが指定されていないと、同じ名前の集計が既に存在する場合、操作は失敗します。
IF NOT EXISTS
集計が存在しない場合は作成し、存在する場合はエラーは表示されません。
注: IF NOT EXISTSとOR REPLACEを同じ文で使用することはできません。
cql_type
CQL型の入力を指定します。
制約事項: frozenコレクションはサポートされていません。
SFUNC udf_name
ユーザー定義関数を指定します。行ごとに状態関数(SFUNC)を呼び出します。ユーザー定義関数で宣言される最初のパラメーターはstateパラメーターです。関数の戻り値がstateパラメーターに割り当てられ、この値は次の呼び出しに渡されます。タプルなどのコレクション型を使用して複数の値を渡します。
STYPE cql_type
状態関数によって返されるパラメーターのCQL型。
FINALFUNC udf_name
stateパラメーターの最終値に対して実行されるユーザー定義関数。
INITCOND [init_value]
SFUNCの最初のパラメーターの初期条件(値)を定義します。値が定義されていない場合、Nullに設定します。
DETERMINISTIC
特定の入力に対して常に同じ出力を返します。初期条件が必要で、単一値を返します。

デフォルト:false(非確定的)。

注: GROUP BYは、確定的な集計のみをサポートしています。

cyclingキースペースで平均を計算する集計を作成し、team_averageでテストを実施します。
注: このセクションでは、ネイティブのAVG関数と同じ機能を持つ関数を作成する方法について説明します。
  1. stateパラメーターをタプルとして関数を作成します。この関数は、最初の位置で行数をカウントし(レコードごとに1ずつインクリメント)、2番目の位置で現在の行の値を既存の小計に加算して合計を算出して、更新された状態を返します。
    CREATE OR REPLACE FUNCTION cycling.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; 
        $$
    ;
    注: 簡単なテストを使用して、関数が正しく動作していることを確認します。
    CREATE TABLE cycling.test_avg (
      id int PRIMARY KEY,
      state frozen<tuple<int, bigint>>,
      val int
    );
    
    INSERT INTO cycling.test_avg (
      id, state, val
    ) VALUES (
      1, (6, 9949), 51
    );
    
    INSERT INTO cycling.test_avg (
      id, state, val
    ) VALUES (
      2, (79, 10000), 9999
    );
    
    SELECT state, avgstate(state, val), val
    FROM cycling.test_avg;

    最初の値は1ずつインクリメントされ、2番目の値は状態の初期値とvalの結果です。

     state       | cycling.avgstate(state, val) | val
    -------------+------------------------------+------
       (6, 9949) |                   (7, 10000) |   51
     (79, 10000) |                  (80, 19999) | 9999
  2. 選択したカラムの合計値をレコード数で除算する関数を作成します。
    CREATE OR REPLACE FUNCTION cycling.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);
        $$ 
    ;
  3. ユーザー定義集計を作成し、カラムの平均値を計算します。
    CREATE OR REPLACE AGGREGATE cycling.average (
      int
    ) 
      SFUNC avgState 
      STYPE tuple<int,bigint> 
      FINALFUNC avgFinal 
      INITCOND (0, 0)
    ;
  4. SELECT文を使用して関数をテストします。
    SELECT cycling.average(cyclist_time_sec)
    FROM cycling.team_average 
    WHERE team_name = 'UnitedHealthCare Pro Cycling Womens Team' 
      AND race_title = 'Amgen Tour of California Women''s Race presented by SRAM - Stage 1 - Lake Tahoe > Lake Tahoe';