R言語のシンプルな表関数の追加

R AEのコンセプトをより理解するために、以下の例を考えてみよう。

テーブル機能例1

この例では、各入力行について、文字入力列の長さの合計と数値入力列の合計を返す関数を作成する。

コード

/tmp/sampleudtf.Rファイルに以下のコードを入力する:
nz.fun <- function () {
while(getNext()) {
tl <- 0
ts <- 0
for (i in seq(inputColumnCount())) {
x <- getInputColumn(i-1)
if (is.character(x)) {
tl <- tl + nchar(x)
}
if (is.numeric(x)) {
ts <- ts + as.double(x)
}
}
setOutputInt32(0, tl)
setOutputDouble(1, ts)
outputResult()
}
}

コンパイル

次のようにファイルをコンパイルする:
/nz/export/ae/utilities/bin/compile_ae --language r --version 3 \
--template compile --user nz --db dev /tmp/sampleudtf.R

登録

AEを以下のように登録する:
/nz/export/ae/utilities/bin/register_ae --language r --version 3 --user nz \
--db dev --template udtf --sig 'rtotal(VARCHAR(1024),DOUBLE)' \
--return 'TABLE(length INT4, sum DOUBLE)' --exe sampleudtf.R

実行中

以下のようにUDTFを実行する:
SELECT * FROM TABLE WITH FINAL(rtotal('text', 1));
LENGTH | SUM
--------+-----
4 | 1
(1 row)

テーブル機能例2

この例では複数の出力行を示している。 なぜなら、文字列の長さの合計は

コード

/tmp/sampleudtf.Rファイルに以下のコードを入力する:
nz.fun <- function () {
while(getNext()) {
tl <- 0
ts <- 0
for (i in seq(inputColumnCount())) {
x <- getInputColumn(i-1)
if (is.character(x)) {
tl <- tl + nchar(x)
}
if (is.numeric(x)) {
ts <- ts + as.double(x)
}
}
setOutputString(0, 'total length of character columns')
setOutputDouble(1, tl)
outputResult()
setOutputString(0, 'total sum of numerics')
setOutputDouble(1, ts)
outputResult()
}
}

integer、numericの合計がdouble型である場合、入力のデータ型(この場合はdouble)に基づいて、2番目の出力列に最も柔軟なデータ型を選択する。 この例では、Rのコードが若干異なります。

コンパイル

次のようにファイルをコンパイルする:
/nz/export/ae/utilities/bin/compile_ae --language r \
--version 3 --template compile --user nz --db dev \
/tmp/sampleudtf.R

登録

AEを以下のように登録する。 出力が異なるため、登録時に別の出力署名を指定する必要がある。
/nz/export/ae/utilities/bin/register_ae --language r \
--version 3 --user nz --db dev --template udtf \
--sig 'rtotal(VARCHAR(1024),DOUBLE)' \
--return 'TABLE(name VARCHAR(64), value DOUBLE)' \
--exe sampleudtf.R

実行中

この関数を呼び出すと、次のような出力が出る:
SELECT * FROM TABLE WITH FINAL(rtotal('text', 1));
NAME | VALUE
-----------------------------------+-------
total length of character columns | 4
total sum of numerics | 1
(2 rows)

テーブル機能例3

前の例から登録コマンドを変更することで、VARARGSを使って動的入力シグネチャの関数を作成することができる。

Rコードコンパイルの手順は、前の例と同じです。

登録

AEを以下のように登録する:
/nz/export/ae/utilities/bin/register_ae --language r --version 3 \
--user nz --db dev --template udtf --sig 'rtotal(VARARGS)' \
--exe sampleudtf.R --return 'TABLE(name VARCHAR(64), value DOUBLE)'

実行中

これでRに任意の数の列を渡すことができる:
SELECT * FROM TABLE WITH FINAL(rtotal('text', 1, 'second text',
2, 3, 4, 'the last text'));
NAME | VALUE
-----------------------------------+-------
total length of character columns | 28
total sum of numerics | 10
(2 rows)