MaxComputeでは、ユーザー定義のテーブル値関数 (UDTF) をJavaまたはPythonで記述して、MaxCompute関数の機能を拡張し、ビジネス要件に対応することができます。 このトピックでは、UDTFの種類、制限、使用上の注意事項、および開発プロセスについて説明します。 このトピックでは、UDTFの使用方法についても説明します。
背景情報
UDTFを使用して、1つのデータ入力に対して複数の値を返すことができます。 UDTFの入出力データは、1対多の関係にある。 UDTFがデータの行を読み取るたびに、UDTFは複数の値を返します。 返された値はテーブルと見なされます。 MaxComputeでは、UDTFをJavaまたはPythonで記述できます。
UDTFタイプ | 説明 |
Java UDTF | MaxComputeでは、UDTFをJavaで記述できます。 詳細については、「Java UDTF」をご参照ください。 |
Python UDTF | MaxComputeでは、Python 2とPython 3でUDTFを記述できます。
|
MaxComputeの組み込み関数には、EXPLODEなどの一部のUDTFが含まれます。 組み込みUDTFの詳細については、「その他の関数」または「複合型関数」をご参照ください。
制限事項
ユーザー定義関数 (UDF) を使用してインターネットにアクセスすることはできません。 UDFを使用してインターネットにアクセスする場合は、ビジネス要件に基づいてネットワーク接続申請フォームに入力し、申請書を送信します。 申請が承認された後、MaxComputeテクニカルサポートチームがお客様に連絡し、ネットワーク接続の確立を支援します。 ネットワーク接続申請フォームへの記入方法の詳細については、「ネットワーク接続プロセス」をご参照ください。
SELECTステートメントでUDTFを使用する場合、このステートメントで他の列を指定したり、他の式を使用したりすることはできません。 次のサンプルコードは、誤ったSQL文を示しています。-- The statement contains a UDTF and another column. select value, user_udtf(key) as mycol ...UDTFはネストできません。 次のサンプルコードは、誤ったSQL文を示しています。
-- A UDTF named user_udtf2 is nested in a UDTF named user_udtf1. select user_udtf1(user_udtf2(key)) as mycol...;UDTFは、同じ
SELECTステートメントのGROUP BY、DISTRIBUTE BY、またはSORT BY句では使用できません。 次のサンプルコードは、誤ったSQL文を示しています。-- A UDTF is used together with a GROUP BY clause. select user_udtf(key) as mycol ... group by mycol;
注意事項
UDFを使用する前に、次の項目に注意してください。
UDFは、パフォーマンスにおいて組み込み関数と競合することはできません。 組み込み関数を優先的に使用してビジネスロジックを実装することを推奨します。
SQL文でUDFを使用すると、大量のデータが計算されてデータスキューが発生した場合、コンピューティングジョブのメモリ使用量がデフォルトの割り当てメモリサイズを超えることがあります。 この場合、セッションレベルで
set odps.sql.udf.joiner.jvm.memory=xxxx;コマンドを実行して問題を解決できます。 UDFの詳細については、「MaxCompute UDFに関するFAQ」をご参照ください。UDFの名前が組み込み関数の名前と同じ場合、UDFが優先的に呼び出されます。 たとえば、UDF CONCATと組み込み関数CONCATの両方がMaxComputeに存在する場合、システムは組み込み関数CONCATの代わりにUDF CONCATを自動的に呼び出します。 組み込み関数を呼び出す場合は、組み込み関数の前に
::という記号を追加する必要があります。 たとえば、select ::concat('ab', 'c');を使用できます。
開発プロセス
次の図は、JavaおよびPythonでMaxCompute UDTFを記述する方法を示しています。
UDFを呼び出す
UDFを開発し、UDFをMaxComputeに登録した後、後続のジョブ開発プロセスでUDFを使用できます。 次のメソッドを使用してUDFを呼び出します。
MaxComputeプロジェクトでUDFを使用する: この方法は、組み込み関数を使用する方法と似ています。
プロジェクト間でUDFを使用する: プロジェクトaでプロジェクトBのUDFを使用します。次のステートメントは、例を示します。
select B:udf_in_other_project(arg0, arg1) as res from table_t;プロジェクト間共有の詳細については、「パッケージに基づくプロジェクト間リソースアクセス」をご参照ください。