MaxCompute には、一般的なデータ処理タスク向けにビルトイン関数が用意されています。ビルトイン関数ではご要件のロジックを表現できない場合、ユーザー定義関数 (UDF) を使用して MaxCompute の機能を拡張できます。
パフォーマンス面では、ビルトイン関数が UDF よりも優れています。可能な限りビルトイン関数をご利用ください。ビルトイン関数で対応できないロジックのみ、UDF を実装してください。
UDF を使用するタイミング
変換ロジックをビルトイン関数で表現できない場合に、UDF を使用します。主な適用シーンは以下のとおりです。
カスタム文字列解析やビジネス固有の変換処理
空間データ分析
プロジェクト間のデータ処理パイプライン
標準的な集約演算、文字列操作、算術演算については、デプロイ不要でスケール時に大幅に高いパフォーマンスを発揮するビルトイン関数をご利用ください。
UDF とビルトイン関数の名前が同じ場合、MaxCompute は UDF を呼び出します。代わりにビルトイン関数を呼び出すには、::をプレフィックスとして付けてください。例:select ::concat('ab', 'c');
UDF の種類
広義の UDF には、ユーザー定義スカラー関数 (UDF)、ユーザー定義集計関数 (UDAF)、ユーザー定義テーブル値関数 (UDTF) が含まれます。狭義の UDF は、ユーザー定義スカラー関数のみを指します。
MaxCompute では、以下の 3 種類のコア UDF をサポートしています。
| 種類 | 入力から出力へのマッピング | 動作 |
|---|---|---|
| UDF(ユーザー定義スカラー関数) | 1 対 1 | 各入力行に対して 1 つの出力値を返す |
| UDTF(ユーザー定義テーブル値関数) | 1 対多 | 各入力行に対して、テーブル形式で複数の出力値を返す |
| UDAF(ユーザー定義集計関数) | 多対 1 | 複数の入力行を 1 つの出力値に集約する |
また、特定のユースケース向けに専用の UDF 種別も提供しています。
| 種類 | 利用シーン |
|---|---|
| コード埋め込み型 UDF | Java または Python コードを SQL スクリプト内に直接埋め込むことで、開発を簡素化し、可読性を向上させる |
| SQL UDF | 再利用可能な SQL ロジックをカプセル化し、コードの重複を削減する |
| 地理空間 UDF | Hive の地理空間関数を MaxCompute で活用し、空間データを分析する |
制限事項と考慮事項
ハード制限
インターネットアクセス — UDF はデフォルトでインターネットにアクセスできません。インターネットアクセスを有効にするには、ネットワーク接続申請を行ってください。承認後、MaxCompute のテクニカルサポートチームより連絡があり、接続設定が行われます。詳細については、「ネットワーク接続申請フォームネットワーク接続の手順」をご参照ください。
VPC アクセス — UDF はデフォルトで仮想プライベートクラウド (VPC) 内のリソースにアクセスできません。VPC アクセスを有効にするには、MaxCompute と VPC の間でネットワーク接続を確立してください。詳細については、「UDF を使用した VPC 内リソースへのアクセス」をご参照ください。
サポート対象外のテーブル種別 — UDF、UDAF、UDTF は、以下のテーブル種別からデータを読み取ることができません。
スキーマ進化が実行済みのテーブル
複雑なデータの型を含むテーブル
JSON データの型を含むテーブル
トランザクションテーブル
考慮事項
メモリ使用量 — UDF がデータスキューを伴う大規模データセットを処理する場合、計算ジョブがデフォルトの JVM メモリ割り当てを超える可能性があります。メモリ制限を増加させるには、セッションレベルで以下のコマンドを実行します。
set odps.sql.udf.joiner.jvm.memory=xxxx;詳細については、「MaxCompute UDF のよくある質問」をご参照ください。
UDF の開発
コード埋め込み型 UDF、SQL UDF、および 地理空間 UDF の開発プロセスは、標準の UDF、UDTF、UDAF のワークフローとは異なります。これらの種別については、リンク先のドキュメントをご参照ください。
Java
以下の図は、Java UDF の開発ワークフローを示しています。

| ステップ | 必須 | 操作 | プラットフォーム | 備考 |
|---|---|---|---|---|
| 1 | 任意 | odps-sdk-udf の依存関係を POM ファイルに追加 | IntelliJ IDEA(Maven) | odps-sdk-udf を Maven リポジトリ で検索して、最新バージョンを取得できます。例: 0.29.10-public |
| 2 | 必須 | UDF コードの記述 | IntelliJ IDEA(Maven)、MaxCompute Studio | 「UDF 開発仕様および一般的な手順(Java) |
| 3 | 必須 | ローカルマシンでのデバッグまたは単体テストの実行 | — | 出力結果が期待通りであることを確認してください |
| 4 | 必須 | コードを JAR ファイルにパッケージ化 | — | — |
| 5 | 必須 | JAR をリソースとして MaxCompute プロジェクトにアップロード | DataWorks コンソール、MaxCompute クライアント、MaxCompute Studio | アップロード方法は 3 種類あります:DataWorks コンソール(ビジュアル)、MaxCompute クライアント(SQL)、MaxCompute Studio(コード)。プラットフォーム固有のガイドについては、リンク先をご参照ください。 |
| 6 | 必須 | アップロード済み JAR から UDF を作成 | — | — |
| 7 | 任意 | クエリ内で UDF を呼び出し | — | — |
Python
以下の図は、Python UDF の開発ワークフローを示しています。

| ステップ | 必須 | 操作 | プラットフォーム | 備考 |
|---|---|---|---|---|
| 1 | 必須 | UDF コードの記述 | MaxCompute Studio | 「UDF 開発仕様および一般的な手順(Python 3)」または「Python 2 |
| 2 | 必須 | ローカルマシンでのデバッグまたは単体テストの実行 | — | 出力結果が期待通りであることを確認してください |
| 3 | 必須 | Python ファイルおよび必要なリソース(ファイルリソース、テーブルリソース、サードパーティパッケージ)を MaxCompute プロジェクトにアップロード | DataWorks コンソール、MaxCompute クライアント、MaxCompute Studio | アップロード方法は 3 種類あります:DataWorks コンソール(ビジュアル)、MaxCompute クライアント(SQL)、MaxCompute Studio(コード)。プラットフォーム固有のガイドについては、リンク先をご参照ください。 |
| 4 | 必須 | アップロード済みファイルから UDF を作成 | — | — |
| 5 | 任意 | クエリ内で UDF を呼び出し | — | — |
SDK リファレンス
以下の SDK は Java UDF 開発をサポートしています。パッケージおよびクラスの詳細については、「MaxCompute SDK」をご参照ください。
| SDK | 説明 |
|---|---|
| odps-sdk-core | 基本的な MaxCompute リソースを管理 |
| odps-sdk-commons | Java 向け共通ユーティリティ |
| odps-sdk-udf | UDF API |
| odps-sdk-mapred | MapReduce API |
| odps-sdk-graph | Graph API |
UDF の呼び出し
UDF を登録した後は、ビルトイン関数と同様の方法で呼び出せます。
同一プロジェクト内 — 任意の ビルトイン関数と同様に、UDF を直接呼び出します。
プロジェクト間 — プロジェクト B の UDF をプロジェクト A で使用する場合は、プロジェクト名をプレフィックスとして指定して参照します。
select B:udf_in_other_project(arg0, arg1) as res from table_t;プロジェクト間の共有設定については、「パッケージに基づくプロジェクト間リソースアクセス」をご参照ください。
次のステップ
UDF 開発の実践例を確認するには、以下のエンドツーエンドのサンプルをご参照ください。