ユーザー定義集計関数 (UDAF) は、複数の入力レコードを単一の出力値にマップします。集約ロジックがビルトイン関数でカバーできない場合に UDAF を使用します。MaxCompute では、Java または Python で記述された UDAF がサポートされています。
UDAF の使用タイミング
ビルトイン関数は分散処理向けに最適化されており、UDAF よりもパフォーマンスが優れています。ユースケースがビルトイン関数でカバーされる場合は、常にビルトイン関数を使用してください。
ビルトイン関数で表現できない集約ロジック(例:カスタム統計モデル、ドメイン固有のスコアリング、複数フィールドを用いた重み付き集約など)が必要な場合は、UDAF を記述してください。
UDAF の種類
| 種類 | 言語 | ランタイム |
|---|---|---|
| Java UDAF | Java | JVM |
| Python 2 UDAF | Python | Python 2.7 |
| Python 3 UDAF | Python | CPython 3.7.3 |
実装の詳細については、「Java UDAF」、「Python 2 UDAF」、および「Python 3 UDAF」をご参照ください。
開発プロセス
Java UDAF
次の図は、Java UDAF の開発ワークフローを示しています。

| ステップ | 必須 | 説明 | プラットフォーム | 参考資料 |
|---|---|---|---|---|
| 1 | いいえ | odps-sdk-udf SDK の依存関係を POM ファイルに追加します。例:<dependency><groupId>com.aliyun.odps</groupId><artifactId>odps-sdk-udf</artifactId><version>0.29.10-public</version></dependency>。最新バージョンは Maven リポジトリ で検索してください。 | IntelliJ IDEA (Maven) | — |
| 2 | はい | UDAF を記述します。 | IntelliJ IDEA (Maven) および MaxCompute Studio | Java での UDF の開発 |
| 3 | はい | ローカルマシンまたは単体テストで UDAF をデバッグします。 | — | — |
| 4 | はい | コードを JAR ファイルにパッケージ化します。 | — | — |
| 5 | はい | JAR ファイルをリソースとして MaxCompute プロジェクトにアップロードします。 | MaxCompute クライアント (odpscmd)、MaxCompute Studio、DataWorks | MaxCompute クライアント: リソースの追加、UDF の作成; MaxCompute Studio: Java プログラムをパッケージ化し、パッケージをアップロードして MaxCompute UDF を作成する; DataWorks: MaxCompute リソースの作成と使用、MaxCompute 関数の作成と使用 |
| 6 | はい | アップロードした JAR ファイルに基づいて UDF を作成します。 | — | — |
| 7 | いいえ | クエリ内で UDAF を呼び出します。 | — | — |
Python UDAF
次の図は、Python UDAF の開発ワークフローを示しています。

| ステップ | 必須 | 説明 | プラットフォーム | 参考資料 |
|---|---|---|---|---|
| 1 | はい | UDAF を記述します。 | MaxCompute Studio | Python UDF の開発 |
| 2 | はい | ローカルマシンまたは単体テストで UDAF をデバッグします。 | — | — |
| 3 | はい | Python ファイルおよび必要なリソース(ファイルリソース、テーブルリソース、サードパーティ製パッケージ)を MaxCompute プロジェクトにアップロードします。 | MaxCompute クライアント (odpscmd)、MaxCompute Studio、DataWorks | MaxCompute クライアント: リソースの追加、UDF の作成; MaxCompute Studio: Python プログラムをアップロードして MaxCompute UDF を作成する; DataWorks: リソースを使用して関数を登録する |
| 4 | はい | アップロードした Python ファイルまたは必要なリソースに基づいて UDF を作成します。 | — | — |
| 5 | いいえ | クエリ内で UDAF を呼び出します。 | — | — |
制限事項
UDAF はインターネットにアクセスできません。インターネットアクセスを有効にするには、ネットワーク接続申請を提出してください。承認後、MaxCompute のテクニカルサポートチームが接続の設定をサポートします。詳細については、「ネットワーク接続プロセス」をご参照ください。
注意事項
パフォーマンス:ビルトイン関数は UDAF よりもパフォーマンスが優れています。ユースケースがビルトイン関数でカバーされる場合は、常にビルトイン関数を使用してください。
メモリ:大規模なデータ量やデータスキューにより、UDAF を使用する SQL ステートメントがデフォルトのメモリ割り当てを超える場合、次のコマンドをセッションレベルで実行して上限を引き上げてください。
set odps.sql.udf.joiner.jvm.memory=xxxx;詳細については、「MaxCompute UDF のよくある質問」をご参照ください。
名前の衝突:UDAF がビルトイン関数と同じ名前を持つ場合、MaxCompute は UDAF を呼び出します。ビルトイン関数を呼び出すには、
::をプレフィックスとして付けてください。例:select ::concat('ab', 'c');
UDAF の呼び出し
同一プロジェクト内: UDAF を、ビルトイン関数 を呼び出すのと同じ方法で呼び出します。
プロジェクト間:プロジェクト名をプレフィックスとして使用します。次の例では、プロジェクト A 内からプロジェクト B の udf_in_other_project を呼び出しています。
select B:udf_in_other_project(arg0, arg1) as res from table_t;クロスプロジェクトリソース共有の設定については、「パッケージに基づくクロスプロジェクトリソースアクセス」をご参照ください。