MaxCompute は、ビジネス要件を満たすためのさまざまなビルトイン関数を備えています。MaxCompute のビルトイン関数がビジネス要件を満たさない場合は、このトピックで説明されている開発プロセスと例に基づいてコードを記述して、ユーザー定義関数(UDF)を作成できます。
背景情報
広義には、UDF にはユーザー定義スカラー関数、ユーザー定義集計関数(UDAF)、およびユーザー定義テーブル値関数(UDTF)が含まれます。狭義には、UDF はユーザー定義スカラー関数のみを指します。次の表に、MaxCompute UDF の種類を示します。
UDF の種類 | シナリオ |
この種類の UDF は、入力データと出力データが一対一のマッピング関係にあるシナリオに適用できます。UDF の入力データと出力データの間には、一対一のマッピングが確立されます。UDF はデータの行を読み取るたびに、出力値を返します。 | |
この種類の UDF は、入力データと出力データが一対多のマッピング関係にあるシナリオに適用できます。UDTF の入力データと出力データの間には、一対多のマッピングが確立されます。UDTF はデータの行を読み取るたびに、テーブルと見なされる複数の値を返します。 | |
UDAF の入力データと出力データの間には、多対一のマッピングが確立されます。複数の入力レコードが集計されて、1 つの出力値が生成されます。 |
上記の UDF に加えて、MaxCompute は特別なシナリオ向けに次の UDF を提供しています。
UDF の種類 | シナリオ |
MaxCompute UDF の開発プロセスを簡素化し、コードロジックを表示する場合は、Java または Python コードを SQL スクリプトに埋め込むことができます。 | |
コードに重複コードが含まれている場合は、SQL UDF を使用してコードの再利用率を向上させ、開発プロセスを簡素化できます。 | |
Hive 地理空間関数を使用して、MaxCompute の空間データを分析できます。 |
制限
UDF を使用してインターネットにアクセスする
デフォルトでは、MaxCompute では UDF を使用してインターネットにアクセスすることはできません。UDF を使用してインターネットにアクセスする場合は、ビジネス要件に基づいて ネットワーク接続申請フォーム に記入して申請書を提出してください。申請が承認されると、MaxCompute テクニカルサポートチームから連絡があり、ネットワーク接続の確立を支援します。ネットワーク接続申請フォームの記入方法の詳細については、「ネットワーク接続プロセス」をご参照ください。
UDF を使用して VPC にアクセスする
デフォルトでは、MaxCompute では UDF を使用して VPC 内のリソースにアクセスすることはできません。UDF を使用して VPC 内のリソースにアクセスするには、MaxCompute と VPC の間にネットワーク接続を確立する必要があります。関連操作の詳細については、「UDF を使用して VPC 内のリソースにアクセスする」をご参照ください。
UDF、UDAF、または UDTF を使用してテーブルデータを読み取る
UDF、UDAF、または UDTF を使用して、次の種類のテーブルからデータを読み取ることはできません。
スキーマ進化が実行されたテーブル
複雑なデータ型を含むテーブル
JSON データ型を含むテーブル
トランザクショナルテーブル
注意事項
UDF を使用する前に、次の点に注意してください。
UDF はパフォーマンス面でビルトイン関数に匹敵することはできません。ビジネスロジックを実装するには、優先的にビルトイン関数を使用することをお勧めします。
SQL 文で UDF を使用する場合、大量のデータが計算され、データスキューが発生すると、計算ジョブのメモリ使用量がデフォルトで割り当てられたメモリサイズを超える可能性があります。この場合は、セッションレベルで
set odps.sql.udf.joiner.jvm.memory=xxxx;コマンドを実行することで問題を解決できます。UDF の詳細については、「MaxCompute UDF に関するよくある質問」をご参照ください。UDF の名前がビルトイン関数の名前と同じである場合、UDF が優先的に呼び出されます。たとえば、MaxCompute に UDF CONCAT とビルトイン関数 CONCAT の両方が存在する場合、システムはビルトイン関数 CONCAT ではなく UDF CONCAT を自動的に呼び出します。ビルトイン関数を呼び出す場合は、ビルトイン関数の前に記号
::を追加する必要があります。たとえば、select ::concat('ab', 'c');を使用できます。
開発プラットフォームと開発プロセス
このセクションでは、UDF、UDTF、または UDAF を開発する方法について説明します。
コード埋め込み UDF、SQL UDF、および 地理空間 UDF の開発プロセスは異なります。詳細については、関連ドキュメントをご参照ください。
Java を使用して UDF を開発する
次の図は、Java で MaxCompute UDF を開発する方法を示しています。

手順 | 説明 | プラットフォーム | 注意事項または参考文献 | |
1 | オプション | Maven を使用してコードを記述する前に、関連する SDK 依存関係を POM ファイルに追加する必要があります。これにより、コードをコンパイルできるようになります。次の SDK 依存関係は例を示しています。 Maven リポジトリ から |
| なし。 |
2 | 必須 | ビジネス要件に基づいて UDF コードを記述します。 |
| Java を使用して UDF を開発する場合は、Java UDF 開発仕様の要件が満たされていることを確認してください。詳細については、「UDF 開発仕様と一般的なプロセス (Java)」をご参照ください。 |
3 | 必須 | オンプレミス マシンで UDF を実行するか、単体テストを実行してデバッグし、結果が期待どおりであるかどうかを確認します。 | ||
4 | 必須 | UDF コードをデバッグして、オンプレミス マシンで正常に実行された後にコードが JAR ファイルにパッケージ化されていることを確認します。 | ||
5 | 必須 | JAR ファイルをリソースとして MaxCompute プロジェクトにアップロードします。 | リソースをアップロードして関数を登録するには、次の 3 つの方法を使用できます。
| |
6 | 必須 | アップロードした JAR ファイルに基づいて UDF を作成します。 | ||
7 | オプション | クエリデータコードで UDF を呼び出します。 | なし。 | |
Python を使用して UDF を開発する
次の図は、Python で MaxCompute UDF を開発する方法を示しています。
手順 | 説明 | プラットフォーム | 注意事項または参考文献 | |
1 | 必須 | ビジネス要件に基づいて UDF を記述します。 | Python を使用して UDF を開発する場合は、Python UDF 開発仕様の要件が満たされていることを確認してください。詳細については、「UDF 開発仕様と一般的なプロセス (Python 3)」または「UDF 開発仕様と一般的なプロセス (Python 2)」をご参照ください。 | |
2 | 必須 | オンプレミス マシンで UDF を実行するか、単体テストを実行してデバッグし、結果が期待どおりであるかどうかを確認します。 | ||
3 | 必須 | Python ファイルまたは必要なリソース (ファイルリソース、テーブルリソース、サードパーティ パッケージなど) を MaxCompute プロジェクトにアップロードします。 | リソースをアップロードして関数を登録するには、次の 3 つの方法を使用できます。
| |
4 | 必須 | アップロードされた Python ファイルまたは必要なリソースに基づいて UDF を作成します。 | ||
5 | オプション | クエリデータコードで UDF を呼び出します。 | なし。 | |
開発リファレンス: MaxCompute SDK
次の表に、MaxCompute が提供する SDK について説明します。各 SDK に含まれるパッケージとパッケージ内のクラスの詳細については、「MaxCompute SDK」をご参照ください。
SDK名 | 説明 |
odps-sdk-core | MaxCompute の基本リソースを管理するためのクラスを提供します。 |
odps-sdk-commons | Java 用の共通ユーティリティを提供します。 |
odps-sdk-udf | UDF を提供します。 |
odps-sdk-mapred | MapReduce API を提供します。 |
odps-sdk-graph | Graph API を提供します。 |
UDF の呼び出し
UDF を開発し、MaxCompute に登録した後、後続のジョブ開発プロセスで UDF を使用できます。 UDF を呼び出すには、次のメソッドを使用します。
MaxCompute プロジェクトで UDF を使用する: このメソッドは、ビルトイン関数を使用するメソッドに似ています。
プロジェクト間で UDF を使用する: プロジェクト A でプロジェクト B の UDF を使用します。 次の文は例を示しています:
select B:udf_in_other_project(arg0, arg1) as res from table_t;。 プロジェクト間の共有の詳細については、「パッケージに基づくプロジェクト間リソースアクセス」をご参照ください。