スカラー Python UDF の作成
スカラー Python UDF には、関数が呼び出されると実行され、単一値を返す Python プログラムが組み込まれています。CREATE FUNCTION コマンドは以下のパラメータを定義します。
-
(省略可能) 入力引数。各引数に名前とデータ型がある必要があります。
-
1 つの戻りデータ型。
-
1 つの実行可能な Python プログラム。
入力データ型および戻りデータ型に SMALLINT、INTEGER、BIGINT、DECIMAL、REAL、DOUBLE PRECISION、BOOLEAN、CHAR、VARCHAR、DATE、または TIMESTAMP を使用できます。また、Python UDF は ANYELEMENT データタイプを使用できます。このタイプは、Amazon Redshift によって、ランタイム時に示される引数のデータタイプに基づく標準データタイプに自動的に変換されます。詳細については、「ANYELEMENT データ型」を参照してください。
Amazon Redshift クエリがスカラー UDF を呼び出すと、以下のステップがランタイム時に発生します。
-
関数が入力引数を Python データ型に変換します。
Amazon Redshift データ型と Python データ型のマッピングについては、「Python UDF データ型」を参照してください。
-
関数が Python プログラムを実行し、変換した入力引数を渡します。
-
Python コードが単一値を返します。戻り値のデータ型は、関数定義で指定されている RETURNS データ型と対応している必要があります。
-
関数が Python の戻り値を、指定されている Amazon Redshift データ型に変換してから、その値をクエリに返します。
注記
Python 3 は Python UDF では使用できません。Amazon Redshift UDF に対する Python 3 のサポートを取得するには、スカラー Lambda UDF の作成 を代わりに使用します。
スカラー Python UDF の例
次の例は、2 つの数値を比較し、大きいほうの数値を返す関数を作成する方法を示しています。二重ドル記号 ($$) の間にあるコードのインデントは Python の要件です。詳細については、「CREATE FUNCTION」を参照してください。
create function f_py_greater (a float, b float) returns float stable as $$ if a > b: return a return b $$ language plpythonu;
次のクエリは、新しい f_greater
関数を呼び出して SALES テーブルをクエリし、COMMISSION または PRICEPAID の 20% のどちらか大きいほうを返します。
select f_py_greater (commission, pricepaid*0.20) from sales;
ANYELEMENT データ型
ANYELEMENT は、ポリモーフィックなデータ型です。引数のデータ型として ANYELEMENT を使用して関数が宣言されている場合、その関数は、呼び出されたときに、標準の Amazon Redshift データ型をその引数の入力として受け入れることができます。ANYELEMENT 引数は、関数が呼び出されたときに、それに実際に渡されるデータ型に設定されます。
1 つの関数が複数の ANYELEMENT データ型を使用する場合、これらのデータ型のすべてが、関数が呼び出されたときに、同一の実際のデータ型に解決される必要があります。すべての ANYELEMENT 引数データ型が、ANYELEMENT に最初に渡される引数の実際のデータ型に設定されます。たとえば、f_equal(anyelement, anyelement)
として宣言されている関数は、これら 2 つの入力値が同じデータ型である限り、両方の入力値をとります。
関数の戻り値が ANYELEMENT として宣言されている場合は、少なくとも 1 つの入力引数が ANYELEMENT である必要があります。戻り値の実際のデータ型は、ANYELEMENT 入力引数に指定されている実際のデータ型と同じになります。