Python言語スカラー関数
次の例は、数値の集合を合計する単純なスカラー関数を示している。 この例では、単純なAEを作るところから始める。 ファイル名は「applyop.py。
コード
nzae.Aeからクラスを派生させる。 ベースクラスはほとんどの作業を処理するので、通常は'class-method "run()"を呼び出す。run()関数はクラスをインスタンス化し、エラー処理を設定し、適切な派生関数を呼び出す。 このようなUDFベースのAEでは、'_getFunctionResult()関数をオーバーライドしなければならない。 以下のコードを「applyop.pyファイルに保存する:import nzae class ApplyOpUdfAe(nzae.Ae): def _getFunctionResult(self, row): # OUR CUSTOM CODE WILL GO HERE. ApplyOpUdfAe.run()- カスタムPythonコードを完成させる。 このUDFでは、2つの整数だけでなく、足し算ならプラス記号(+)、掛け算ならアスタリスク(*)を文字列演算子として渡す。 このコードは整数の積か和を返す。 SQLでは、この単純なバージョンはどちらかによって呼び出される:
またはSELECT applyop('+', 3, 5);SELECT applyop('*', 3, 5);前述の例では入力は1つだけだが、NPSシステムは入力のストリームを扱う。 従って、NPSシステムの方が利用しやすい:SELECT applyop(mytable.operator, mytable.value1, mytable.value2) FROM mytable;最初の例では、NPSシステムは定数 "+"、3、5を受け取り、それらを3つの要素を含む長さ1のストリームに変換する。
_getFunctionResult()によって、3つの要素を含む1つの行が "見える"。 内部的には、前述のケースはすべて同じように処理され、「applyopAEには複数の入力があると仮定できる。 - 入力を処理するループは、一度に1行を関数に渡すために必要なので、1行の入力を処理するカスタムコードを入力する:
import nzae class ApplyOpUdfAe(nzae.Ae): def _getFunctionResult(self, row): # BREAK APART OUR ROW OF INPUT. operator, leftInput, rightInput = row # HANDLE ADDITION. if operator == "+": return leftInput + rightInput # HANDLE MULTIPLICATION. if operator == "*": return leftInput * rightInput # ERROR ON ALL OTHER. self.userError("Unhandled operator to ApplyOp: '" + operator + "'.") ApplyOpUdfAe.run()関数'
self.userError()はSQLユーザーにエラーを報告する。_getFunctionResult()で返されるものはすべて、SQL操作の結果である。 これはUDFとして実行されるため、結果には1つの列しか存在しない。 後の例では、UDTFを使って複数の列を出力する方法を示す。 コードが完成したら、デプロイして登録しなければならない。
コンパイル
PythonAEはコンパイルを必要としない。
デプロイメント
PythonAEはコンパイルを必要としないが、デプロイが必要である。 compile_aeコマンドは、スクリプトを共有エクスポートドライブ上のデフォルトの場所にデプロイする「
--templateデプロイメントオプションと一緒に引き続き使用されます。$NZ_EXPORT_DIR/ae/utilities/bin/compile_ae --language python64 \
--template deploy ./applyop.py --version 3登録
Pythonファイルを登録します:
$NZ_EXPORT_DIR/ae/utilities/bin/register_ae --language python64 --version 3 \
--template udf --exe applyop.py --sig "applyop(varchar(1), int4, int4)" \
--return int4実行中
これでAEをSQLで実行できるようになった:
SELECT applyop('+', 4, 10);
APPLYOP
---------
14
(1 row)
_getFunctionResult()の型を検証するために、'self.userError()が呼び出されることに注意。 次の例ではエラーが発生する:SELECT applyop('-', 1, 2);
ERROR: Unhandled operator TO ApplyOp: '-'.