R言語集計1

この例では、次のファイル名を使用している: 'maxae.R

この例では、一連の入力値から最も長い文字列と最も大きい数値を見つけ、それらの合計値を返すUDAを作成します。

概念

R言語アダプターは、入力ソース・ファイルで定義しなければならない以下の関数を定義している。
  • nz.init
  • nz.accum
  • nz.merge
  • nz.final
これらの関数は、その後のステップで実行時に呼び出される。 データにアクセスするために、関数は関数やテーブル関数と同じAPI関数を使わなければならない。

C-Analytic-Executable APIは、すべての状態のデータを処理するための特別なAPIを定義している。 しかしRでは処理が簡略化され、標準関数を使って入力データ、出力データ、状態データにアクセスできる。 アグリゲーション・モードでのみ呼び出せる追加関数として、「getState関数と「getOutputColumn関数がある。

入力、出力、状態は、定義された状態において以下の意味を持つ:
処理の状態 入力API 出力API

初期化

なし 状態
累計 入力 状態
マージ 状態 マージ状態
ファイナライズ マージ状態 出力
表によると、以下の条件が当てはまる:
  • 初期化状態では、入力はなく、出力APIが初期状態の値を設定するために使用される。
  • 累積状態では、入力APIは入力テーブルから入力データにアクセスし、出力APIは状態変数を制御する。
  • マージ状態では、この関数を呼び出すたびに、データ処理を実行するノードやデータスライスからの入力に対して、別の状態変数のセットにアクセスできる。
  • ファイナライズ状態では、マージ状態の変数は入力APIを通してアクセス可能であり、出力APIはUDA出力を制御し、それはSQLクエリの結果として報告される

コード

この例では、指定されたグループ内の最大値を見つけるUDAについて説明する。

/tmp/maxae.Rファイルに以下のコードを入力する:
nz.mode <- 'aggregate'
nz.init <- function(){
setOutputNull(0)
}
nz.accum <- function(){
input <- getInputColumn(0)
if (is.null(input))
return()
state <- getOutputColumn(0)
if (is.null(state) || input > state)
setOutputInt32(0, input)
}
nz.merge <- function(){
input <- getInputColumn(0)
# if NULL is encountered, we can skip this value set
# since it must to be coming from an empty data slice
if (is.null(input))
return()
state <- getOutputColumn(0)
if (is.null(state) || input > state)
setOutputInt32(0, input)
}
nz.final <- function () {
input <- as.integer(getInputColumn(0))
if (is.null(input))
setOutputNull(0)
else
setOutputInt32(0, input)
}
注:コンパイル・ステップでは、nz.mode変数に別のオブジェクトを追加し、そこに指定された値'aggregate'を代入しなければならない。 この変数を追加しないと、コンパイル時にnz.funオブジェクトが存在しないというエラーが発生する。 nz.modeを設定すると、AEが集約であることをコンパイルスクリプトに伝える。 そして、スクリプトはConceptsにリストされている関数を探す。

コンパイル

コードをコンパイルする:
/nz/export/ae/utilities/bin/compile_ae --language r --template compile \
--version 3 --db dev --user nz /tmp/maxae.R

登録

この例では、「--templateスイッチは新しい値「uda取る。 さらに、「--stateスイッチは、集約ステート変数を定義しているように見える。
/nz/export/ae/utilities/bin/register_ae --language r --template uda \
--version 3 --db dev --user nz --sig 'maxae(INT4)' --return 'INT4' \
--state '(INT4)' --exe maxae.R

実行中

注:マージ状態で UDA を実行すると、入力状態変数のセットには、集約クエリに関連するデータのないデータ・スライスの状態変数が含まれます。 その結果、マージ関数で処理しなければならないNULLの入力状態値が存在する可能性がある。
以下の例は、このシナリオを強調するための特別なコメントを含んでいる。 集計を実行する前に、ダミーテーブルを作成する必要があります。 集計を実行すると、次のような結果が得られる:
CREATE TABLE grp_test (grp int4, val int4);
CREATE TABLE
INSERT INTO grp_test VALUES (1, 1);
INSERT 0 1
INSERT INTO grp_test VALUES (1, 2);
INSERT 0 1
INSERT INTO grp_test VALUES (1, 3);
INSERT 0 1
INSERT INTO grp_test VALUES (2, 4);
INSERT 0 1
SELECT maxae(val) FROM grp_test;
MAXAE
-------
4
(1 row)
SELECT grp, maxae(val) FROM grp_test GROUP BY grp;
GRP | MAXAE
-----+-------
2 | 4
1 | 3
(2 rows)
SELECT grp, maxae(val) over (partition BY grp) FROM grp_test;
GRP | MAXAE
-----+-------
1 | 3
1 | 3
1 | 3
2 | 4
(4 rows)