このトピックでは、IntelliJ IDEA の MaxCompute Studio を使用して、Java ユーザー定義関数 (UDF) の作成、テスト、デプロイ、および呼び出しを行う方法について説明します。UDF は、データの各行で実行されるカスタムロジックで MaxCompute SQL を拡張します。このチュートリアルを完了すると、STRING 型の引数を受け取り、その小文字の文字列を返す Lower_test という名前のスカラー UDF が作成されます。
作成するもの
STRING 型の引数を受け取り、その小文字の文字列を返すスカラー UDF (Lower_test) です。完全なワークフローは、以下をカバーします。
- IntelliJ IDEA での Java クラスの作成
- ロジックを検証するためのローカルでの実行
- MaxCompute プロジェクトへの JAR のデプロイ
- SQL ステートメントでの UDF の呼び出し
型マッピングのリファレンス
evaluate() メソッドのシグネチャを設計する際は、次のように MaxCompute SQL 型を Java 型にマッピングします。
| MaxCompute SQL 型 | Java 型 |
|---|---|
| STRING | String |
| BIGINT | Long |
| DOUBLE | Double |
| BOOLEAN | Boolean |
| DATETIME | java.util.Date |
前提条件
開始する前に、次のタスクを完了してください。
-
MaxCompute Studio のインストール:IntelliJ IDEA 用の MaxCompute Studio プラグインをインストールします。MaxCompute Studio のインストール
-
MaxCompute プロジェクトへの接続:UDF をデプロイする MaxCompute プロジェクトへの接続を確立します。MaxCompute プロジェクト接続の作成
-
MaxCompute Java モジュールの作成:UDF の作成とコンパイルに必要な Java モジュール構造をセットアップします。MaxCompute Java モジュールの作成
操作手順
-
Java で UDF を作成します。
-
左側のナビゲーションウィンドウで、[Project] タブをクリックします。 を展開し、java を右クリックして、 を選択します。

-
[Create new MaxCompute java class] ダイアログボックスで、[UDF] をクリックします。[Name] フィールドにクラスの名前を入力し、Enter キーを押します。

[Name] は、作成する MaxCompute Java クラスの名前を指定します。パッケージを作成していない場合は、packagename.classname と入力してパッケージを自動的に生成できます。
注:パッケージを作成していない場合は、packagename.classname のフォーマットで名前を入力します。システムによってパッケージが自動的に生成されます。
-
生成された Java ファイルに、UDF ロジックを実装します。次の例は、文字列を小文字に変換する UDF を示しています。

package <packagename>; import com.aliyun.odps.udf.UDF; // すべての MaxCompute UDF に必要な基底クラス public final class Lower extends UDF { // スカラー関数の場合は UDF を継承する必要があります // evaluate() は各行に対して呼び出されるエントリーポイントです。 // パラメーターと戻り値の型は MaxCompute SQL 型 (String -> STRING) にマッピングされます。 public String evaluate(String s) { if (s == null) { // 実行時エラーを回避するために、常に NULL 入力を処理します return null; } return s.toLowerCase(); } }注:<packagename> を実際のパッケージ名 (例:com.example) に置き換えてください。
-
-
UDF をローカルでデバッグします。
デプロイ前に MaxCompute テーブルに対して UDF をローカルで実行し、ロジックを検証します。
-
java ディレクトリで、Java ファイルを右クリックし、[Run] を選択します。
-
[Run/Debug Configurations] ダイアログボックスで、次のフィールドを設定します。

-
MaxCompute project:UDF が実行される MaxCompute プロジェクト。ドロップダウンリストから local を選択すると、クラスターに送信せずにローカルで実行されます。
-
MaxCompute table:ローカル実行の入力データを提供する MaxCompute テーブルの名前。
-
Table columns:UDF が操作する MaxCompute テーブルの列。
-
-
[OK] をクリックします。UDF がローカルで実行され、戻り結果が出力パネルに表示されます。

ヒント:ローカルでの実行が成功すると、evaluate() メソッドが入力型と NULL 値を正しく処理していることが確認できます。デプロイに進む前に、エラーを修正してください。
-
-
UDF を MaxCompute にデプロイします。
ローカルテストに合格したら、UDF をパッケージ化して登録し、SQL で使用できるようにします。
-
UDF の Java ファイルを右クリックし、[Deploy to Server...] を選択します。
-
[Package a jar, submit resource and register function] ダイアログボックスで、次のフィールドを設定します。

-
MaxCompute project:デプロイ先のプロジェクト。デフォルト値は、UDF の作成時に接続したプロジェクトを反映しています。別のプロジェクトを対象としない限り、デフォルト値を保持してください。
-
Resource file:JAR リソースファイルのパス。デフォルト値を保持してください。
-
Resource name:MaxCompute に登録されるリソースの名前。デフォルト値を保持してください。
-
Function name:SQL ステートメントで UDF を呼び出すために使用される名前。Lower_test と入力します。
警告:[Function name] の値は、SQL クエリで使用する名前です。MaxCompute の組み込み関数と競合する名前は避けてください。競合が存在する場合、カスタム UDF が組み込み関数をシャドウイングしたり、オーバーライドに失敗したりする可能性があります。
-
-
[OK] をクリックします。MaxCompute Studio はコードを JAR にパッケージ化し、リソースとしてアップロードし、選択したプロジェクトに Lower_test を関数として登録します。
-
-
SQL で UDF を呼び出します。
-
左側のナビゲーションウィンドウで、[Project Explorer] タブに移動します。
-
ご利用の MaxCompute プロジェクトを右クリックし、[Open in Console] を選択します。
-
コンソールで、次の SQL ステートメントを入力し、Enter キーを押します。
select Lower_test('ALIYUN');
-
出力を確認します。次の結果が返され、Lower_test Java UDF が正しく機能していることを示します。
期待される出力: +------------+ | _c0 | +------------+ | aliyun | +------------+
-
トラブルシューティング
| 症状 | 考えられる原因 | 解決方法 |
|---|---|---|
ClassNotFoundException(デプロイ後) |
JAR ファイルが正しいプロジェクトにアップロードされていない | デプロイダイアログボックスの MaxCompute プロジェクト フィールドが目的のプロジェクトを指していることを確認し、再度デプロイします。 |
Permission denied |
権限が不十分 | ご利用のアカウントが対象の MaxCompute プロジェクトに対して CreateFunction 権限を持っていることを確認してください。 |
NullPointerException |
evaluate() | 入力パラメーターに対する操作の前に、if (s == null) { return null; } のチェックを追加します。 |
| SQL で関数名が解決されない | 異なる名前で関数が登録されている | MaxCompute プロジェクトの関数リストで登録済みの名前を確認し、SQL 呼び出しを登録名と一致させてください。 |
次のステップ
Java UDF のデプロイとテストが正常に完了したら、次のことができます。
-
他の UDF 型の開発:より高度なユースケースのために、UDAF (ユーザー定義集計関数) と UDTF (ユーザー定義テーブル値関数) を探求します。
-
UDF パフォーマンスの最適化:evaluate() 内のオブジェクトアロケーションを最小限に抑えるなど、UDF パフォーマンスに関する MaxCompute のベストプラクティスを確認します。
-
プロジェクト間での UDF の共有:同じリソースファイルを複数の MaxCompute プロジェクトに登録して、再デプロイせずに UDF を再利用します。