はじめに

本記事では、Verticaの拡張機能であるユーザー定義拡張関数(UDx)を紹介します。

ユーザー定義拡張関数(UDx)とは

ユーザー定義拡張関数とは、外部の言語を用いて書かれた関数です。通常のSQLでの記述が難しい分析処理や、機械学習においてVerticaには実装されていないアルゴリズムを用いたい場合に有効な手法です。
現在Verticaでは、Python, R, C++, Java の4つの言語を利用することができます。今回は、プログラムコード例をPythonで記述しています。

ユーザー定義拡張関数の種類

Pythonで使用できるユーザー定義拡張関数には、大きくわけてスカラー関数とトランスフォーム関数の2種類があります。(この点はRも同様)

スカラー関数

スカラー関数は、読み込んだデータ1行に対して単一の値(列)を返す関数です。この範囲に収まらない場合は、後述するトランスフォーム関数を利用する必要があります。

トランスフォーム関数

トランスフォーム関数は、読み込んだデータ1行に対して複数の行および複数の列を返すことができます。出力が多岐にわたる場合やテーブルの外形を変化させる処理を実施する場合は、こちらの関数を利用します。

スカラー関数の利用例

例1:2倍の値を返す


入力値と出力値が 1列 対 1列 となる場合、スカラー関数で実装可能です。

例2:2列の和の値を返す


入力値と出力値が 複数列 対1列 となる場合でも、スカラー関数で実装可能です。

トランスフォーム関数の利用例

例3:2列の和と差の値を2列で返す


入力値と出力値が 複数列 対 複数列 となる場合には、トランスフォーム関数を利用する必要があります。

例4:2列の和と差の値を2行で返す


この例は入力値と出力値が 複数列 対 1列 となっています。しかし1行の入力値に対して複数行の出力値を返しているため、このようなケースではトランスフォーム関数を利用する必要があります。

スカラー関数のプログラムコード例

2列の和の値を返すスカラー関数をPythonで実装します。
Pythonコードの例(ファイル名:col_sum_func_sc.py)



テーブルTable1を確認します。



Pythonプログラム col_sum_func_sc.py をVerticaのライブラリPylibSCとして登録します。



ライブラリPylibに、ファンクションcol_sum_func_scを定義します。
この際、入出力の型を定義するファンクションcol_sum_func_sc_Factoryも同時に定義します。



ファンクションcol_sum_func_scを呼び出すSQLを実行します。



トランスフォーム関数のプログラムコード例

2列の和と差(1列目-2列目)の値を2列で返すトランスフォーム関数をPythonで実装します。
Pythonコードの例(ファイル名:col_sum_func_tf.py)



Pythonプログラム col_sum_func_tf.py をVerticaのライブラリPylibとして登録します。



ライブラリPylibに、ファンクションcol_sum_func_tfを定義します。
この際、入出力の型を定義するファンクションcol_sum_func_tf_Factoryも同時に定義します。



ファンクションcol_sum_func_tfを呼び出すSQLを実行します。



参考情報

Developing User-Defined Extensions (UDxs)
https://www.vertica.com/docs/9.3.x/HTML/Content/Authoring/ExtendingVertica/UDx/DevelopingUDxs.htm

Scalar Functions (UDSFs)
https://www.vertica.com/docs/9.3.x/HTML/Content/Authoring/ExtendingVertica/UDx/ScalarFunctions/ScalarFunctions.htm

Transform Functions (UDTFs)
https://www.vertica.com/docs/9.3.x/HTML/Content/Authoring/ExtendingVertica/UDx/TransformFunctions/TransformFunctions.htm

検証バージョンについて

この記事の内容はVertica 9.3.1で確認しています。

更新履歴