MaxComputeでは、ユーザー定義の集計関数 (UDAF) をJavaまたはPythonで記述して、MaxCompute関数の機能を拡張し、ビジネス要件に対応することができます。 このトピックでは、UDAFの種類、制限、使用法のメモ、および開発プロセスについて説明します。 このトピックでは、UDAFの使用方法についても説明します。
背景情報
多対1マッピングは、UDAFの入力データと出力データとの間に確立される。 複数の入力レコードを集約して1つの出力値を生成する。 MaxComputeでは、UDAFをJavaまたはPythonで記述できます。 次の表に、2種類のUDAFを示します。
UDAFタイプ | 説明 |
Java UDAF | このタイプのUDAFは、関数ロジックを実装するためにJavaで記述されます。 詳細については、「Java UDAFs」をご参照ください。 |
Python UDAF | このタイプのUDAFは、関数ロジックを実装するためにPythonで記述されています。 Python UDAFは、Python 2 UDAFとPython 3 UDAFに分類されます。
|
制限事項
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に関するFAQ」をご参照ください。UDFの名前が組み込み関数の名前と同じ場合、UDFが優先的に呼び出されます。 たとえば、UDF CONCATと組み込み関数CONCATの両方がMaxComputeに存在する場合、システムは組み込み関数CONCATの代わりにUDF CONCATを自動的に呼び出します。 組み込み関数を呼び出す場合は、組み込み関数の前に
::
という記号を追加する必要があります。 たとえば、select ::concat('ab', 'c');
を使用できます。
開発プロセス
このセクションでは、UDAFの開発プロセスについて説明します。
Javaを使用したUDFの開発
次の図は、JavaでMaxCompute UDFを開発する方法を示しています。
手順 | 説明 | プラットフォーム | 注意または参照 | |
1 | 任意 | Mavenを使用してコードを記述する前に、関連するSDKの依存関係をPOMファイルに追加する必要があります。 これにより、コードを確実にコンパイルできます。 次のSDK依存関係は、例を示しています。
Mavenリポジトリから |
| なし。 |
2 | 必要 | ビジネス要件に基づいてUDFコードを作成します。 |
| Javaを使用してUDFを開発する場合は、Java UDF開発仕様の要件が満たされていることを確認してください。 詳細については、「UDF開発仕様と一般プロセス (Java) 」をご参照ください。 |
3 | 必要 | オンプレミスマシンでUDFを実行するか、単体テストを実行して結果が期待どおりかどうかを確認して、UDFをデバッグします。 | ||
4 | 必要 | UDFコードをデバッグして、オンプレミスマシンで正常に実行された後、コードがJARファイルにパッケージ化されるようにします。 | ||
5 | 必要 | JARファイルをリソースとしてMaxComputeプロジェクトにアップロードします。 |
| |
6 | 必要 | アップロードしたJARファイルに基づいてUDFを作成します。 | ||
7 | 任意 | クエリデータコードでUDFを呼び出します。 | なし。 |
Pythonを使用したUDFの開発
次の図は、PythonでMaxCompute UDFを開発する方法を示しています。
手順 | 説明 | プラットフォーム | 注意または参照 | |
1 | 必要 | ビジネス要件に基づいてUDFを作成します。 | Pythonを使用してUDFを開発する場合は、Python UDF開発仕様の要件が満たされていることを確認してください。 詳細については、「UDF開発仕様と一般プロセス (Python 3) 」または「UDF開発仕様と一般プロセス (Python 2) 」をご参照ください。 | |
2 | 必要 | オンプレミスマシンでUDFを実行するか、単体テストを実行して結果が期待どおりかどうかを確認して、UDFをデバッグします。 | ||
3 | 必要 | Pythonファイルまたは必要なリソース (ファイルリソース、テーブルリソース、サードパーティパッケージなど) をMaxComputeプロジェクトにアップロードします。 |
| |
4 | 必要 | アップロードされたPythonファイルまたは必要なリソースに基づいてUDFを作成します。 | ||
5 | 任意 | クエリデータコードでUDFを呼び出します。 | なし。 |
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;
プロジェクト間共有の詳細については、「パッケージに基づくプロジェクト間リソースアクセス」をご参照ください。