スカラー Python UDF の作成 - Amazon Redshift

スカラー 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 を呼び出すと、以下のステップがランタイム時に発生します。

  1. 関数が入力引数を Python データ型に変換します。

    Amazon Redshift データ型と Python データ型のマッピングについては、「Python UDF データ型」を参照してください。

  2. 関数が Python プログラムを実行し、変換した入力引数を渡します。

  3. Python コードが単一値を返します。戻り値のデータ型は、関数定義で指定されている RETURNS データ型と対応している必要があります。

  4. 関数が 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 入力引数に指定されている実際のデータ型と同じになります。