ユーザー定義テーブル値関数 (UDTF) を使用すると、Java または Python でカスタム関数を記述することで、MaxCompute のビルトイン機能を拡張できます。UDTF は 1 行の入力を読み取り、複数行を返します。出力はテーブルとして扱われます。
MaxCompute には、EXPLODE などのビルトイン UDTF が含まれています。詳細については、「その他の関数」および「複合型関数」をご参照ください。
UDTF の利用シーン
ビルトイン関数でロジックを表現できない場合 (たとえば、入力行ごとに可変数の出力行を出力する必要がある場合や、変換がパーティション内の行全体にわたって蓄積された状態に依存する場合) は、UDTF を使用します。
ビルトイン関数は MaxCompute の分散エンジン向けに最適化されており、大規模な環境では UDTF よりも優れた性能を発揮します。ユースケースに対応できる場合は、常にビルトイン関数を使用してください。
サポートされている言語
| 言語 | バージョン |
|---|---|
| Java | — |
| Python 2 | 2.7 |
| Python 3 | CPython 3.7.3 |
実装の詳細については、「Java UDTF」、「Python 2 UDTF」、および「Python 3 UDTF」をご参照ください。
制限事項
-
インターネットアクセス: UDF はデフォルトではインターネットにアクセスできません。インターネットアクセスを有効にするには、ネットワーク接続申請フォームに記入してください。承認後、MaxCompute テクニカルサポートチームがお客様に連絡し、接続を確立します。詳細については、「ネットワーク接続プロセス」をご参照ください。
-
同じ SELECT 内に他の列を含めない: UDTF を呼び出す
SELECT文は、他の列や式を参照できません。次の文は無効です。-- Invalid: mixes a UDTF with another column select value, user_udtf(key) as mycol ... -
ネスト不可: UDTF は他の UDTF 内にネストできません。次の文は無効です。
-- Invalid: user_udtf2 is nested inside user_udtf1 select user_udtf1(user_udtf2(key)) as mycol...; -
GROUP BY、DISTRIBUTE BY、および SORT BY と互換性なし: UDTF は、これらの句と同じ
SELECT文に含めることはできません。次の文は無効です。-- Invalid: UDTF used with GROUP BY select user_udtf(key) as mycol ... group by mycol;
注意事項
メモリ: UDF ジョブがデータスキューのある大量のデータを処理する場合、ジョブがデフォルトの JVM メモリ割り当てを超過する可能性があります。メモリを増やすには、セッションレベルで次のコマンドを実行します。
set odps.sql.udf.joiner.jvm.memory=xxxx;
MaxCompute UDF に関する FAQ トピックの全リストについては、「MaxCompute UDF に関するよくある質問」をご参照ください。
名前の競合: UDF がビルトイン関数と同じ名前を共有している場合、MaxCompute は UDF を呼び出します。ビルトイン関数を明示的に呼び出すには、:: をプレフィックスとして付けます。
select ::concat('ab', 'c');
開発プロセス
手順は Java と Python でわずかに異なります。
Java
| ステップ | 必須 | 説明 | ツール |
|---|---|---|---|
| 1 | いいえ | Maven SDK 依存関係を POM ファイルに追加します。最新バージョンを取得するには、odps-sdk-udf を Maven リポジトリで検索します。スニペットの例: <dependency><groupId>com.aliyun.odps</groupId><artifactId>odps-sdk-udf</artifactId><version>0.29.10-public</version></dependency> |
IntelliJ IDEA (Maven) |
| 2 | はい | UDTF コードを記述します。 | IntelliJ IDEA (Maven) または MaxCompute Studio |
| 3 | はい | UDTF をご利用のオンプレミス環境のマシンで、または単体テストを通じてデバッグします。 | — |
| 4 | はい | UDTF を JAR ファイルにパッケージ化します。 | — |
| 5 | はい | JAR ファイルをリソースとしてご利用の MaxCompute プロジェクトにアップロードします。 | MaxCompute クライアント、MaxCompute Studio、または DataWorks |
| 6 | はい | アップロードされた JAR ファイルを使用して UDTF を登録します。 | — |
| 7 | いいえ | SQL クエリで UDTF を呼び出します。 | — |
ステップ 2 については、「Java で UDF を開発する」をご参照ください。ステップ 5 については、「リソースを追加する」および「関数を作成する」をご参照ください。MaxCompute Studio を使用してパッケージ化と登録を 1 つのフローで実行するには、「Java プログラムをパッケージ化し、パッケージをアップロードして MaxCompute UDF を作成する」をご参照ください。
Python
| ステップ | 必須 | 説明 | ツール |
|---|---|---|---|
| 1 | はい | UDTF コードを記述します。 | MaxCompute Studio |
| 2 | はい | オンプレミス環境または単体テストを通じて UDTF をデバッグします。 | — |
| 3 | はい | Python ファイルまたは必要なリソース (ファイルリソース、テーブルリソース、サードパーティパッケージ) を MaxCompute プロジェクトにアップロードします。 | MaxCompute クライアント、MaxCompute Studio、または DataWorks |
| 4 | はい | アップロードされたファイルに基づいて UDTF を登録します。 | — |
| 5 | いいえ | SQL クエリで UDTF を呼び出します。 | — |
ステップ 1 については、「Python で UDF を開発する」をご参照ください。ステップ 3 については、「リソースを追加する」および「関数を作成する」をご参照ください。MaxCompute Studio を使用してアップロードと登録を 1 つのフローで実行するには、「Python プログラムをアップロードして MaxCompute UDF を作成する」をご参照ください。
UDTF の呼び出し
同一プロジェクト内では: ビルトイン関数を呼び出すのと同じ方法で、UDTF を呼び出します。ビルトイン関数。
プロジェクト間: プロジェクト A 内からプロジェクト B の UDTF を呼び出すには、次の構文を使用します。
select B:udf_in_other_project(arg0, arg1) as res from table_t;
プロジェクト間リソース共有の詳細については、「パッケージベースのプロジェクト間リソース共有」をご参照ください。