MaxCompute のユーザー定義関数 (UDF) には、UDF (User Defined Scalar Functions)、UDAF User (Defined Aggregation Function)、UDTF (User Defined Table Valued Function) があります。 通常、これらの関数はすべて UDF と呼ばれます。
<dependency>
<groupId>com.aliyun.odps</groupId>
<artifactId>odps-sdk-udf</artifactId>
<version>0.20.7</version>
</dependency>
- MaxCompute Studio を使用して Java UDF の開発を行います。
- Eclipse プラグインを使用して JAVA UDF の開発とデバッグを行い、jar パッケージをエクスポートします。次に、コマンドまたは DataWorks を使用して、リソースの追加と関数の登録を順に行います。
- カスタム関数の登録とログアウト、および関数一覧の照会に関する文については、「関数 (function)」をご参照ください。
- Java と MaxCompute のデータ型のマッピングについては、「パラメーターとリターンタイプ (parameters and return types)」をご参照ください。
UDF の例
- MaxCompute Studio による開発
- ツールと環境を準備します。
MaxCompute Studio のインストール、MaxCompute Studio を使用した MaxCompute プロジェクトリンクの作成、および MaxCompute Java モジュールの作成が含まれます。
- プログラムを作成します。設定が完了している Java Module に Java ファイルを作成します。[MaxCompute Java] を直接選択し、テキストボックスに
package name と file name
を入力します。 [UDF for Kind] を選択します。 次のようにコードを編集します。package <package name>; import com.aliyun.odps.udf.UDF; public final class Lower extends UDF { Public String evaluate (string s ){ if (s == null) { return null; } return s.toLowerCase(); } }
注 Java をローカルでデバッグする場合は、 「UDF の開発とデバッグ (develop and debug UDF)」をご参照ください。 - MaxCompute UDF を登録します 。
下図で示す通り、UDF の Java ファイルを右クリックして、[Deploy to server] を選択します。ダイアログボックスで登録先の MaxCompute プロジェクトを選択し、
function name
を入力します。 また、 リソース名を変更することもできます。すべての設定が終了したら、[OK] をクリックします。 登録が正しく行われると、プロンプトが表示されます。 - UDF を試行します。
SQL スクリプトを開き、
select Lower_test(‘ABC’);
などのコードを実行します。 下図のような結果が表示されます。注 MaxCompute Studio で SQL スクリプトを作成する場合は、「SQL スクリプトの作成 (writing SQL scripts)」をご参照ください。
- ツールと環境を準備します。
- Eclipse プラグインによる開発
- プロジェクトを作成します。
MaxCompute (旧 ODPS) プロジェクトが、Eclipse プラグインで作成されているものとします。詳細は、「MaxCompute プロジェクトの作成 (creating a MaxCompute project)」をご参照ください。
- プログラムを作成します。関数をアーカイブするには、MaxCompute UDF フレームでプログラムの作成と コンパイルを行います。 例
package org.alidata.odps.udf.examples; import com.aliyun.odps.udf.UDF; public final class Lower extends UDF { Public String evaluate (string s ){ if (s == null) { return null; } return s.toLowerCase(); } }
- リソースを追加します。UDF を実行する前に、参照先の UDF コードを指定します。 UDF コードはリソースの形式で MaxCompute に追加されます。 Java UDF は、Jar パッケージにコンパイルして、 Jar リソースとして MaxCompute に追加する必要があります。 自動的に UDF フレームワークに JAR パッケージがロードされて、UDF が実行されます。注 MaxCompute MapReduce には、リソースの使用も記述します。次のコマンドを実行します。
add jar my_lower.jar; -- If the resource name already exists, rename the JAR package. -- Pay attention to modifying related name of JAR package in following command. -- Alternatively, use –f option directly to overwrite original JAR resource.
- UDF を登録します。コマンド形式は、次の通りです。
CREATE FUNCTION AS <package_to_class> USING <resource_list>;
パラメーターの説明:
- function_name 名 : SQL で参照される UDF 名です。
- Package_to_class: Java UDF の場合、完全修飾クラス名(最上位パッケージ名から UDF クラス名まで) です。 Python UDF の場合、Python スクリプト名です。 クラス名。 名前は引用符で囲む必要があります。
- resource_list: UDF で使用されるリソースリストです。
- リソースリストには、 UDF コードの格納先のリソースも含める必要があります。
- ユーザーのコードが、分散キャッシュインターフェイスを介してリソースファイルを読み取る場合、UDF によって読み取られる一連のリソースファイルもリストに含めます。
- リソースリストは、カンマで区切られた複数のリソース名で構成されています。リソース名は引用符で囲む必要があります。
- リソースの存在するプロジェクトを指定する必要がある場合は、< project_name>/resources/<resource_name> と記述します。
JAR パッケージがアップロードされると、MaxCompute でユーザーのコードが読み込まれ、実行されます。 UDF を使用可能にするには、一意の関数名をMaxCompute に登録し、登録した関数名に対応する Jar リソースの関数名を指定する必要があります。
次に、以下のコマンドを実行します。CREATE FUNCTION test_lower AS 'org.alidata.odps.udf.examples.Lower' USING 'my_lower.jar';
注- リソースファイルと同様に、同じ関数名は 一度しか登録できません。
- 通常、システムの組み込み関数を、自己構築した関数に置き換えることはできません。 プロジェクトスペースのプロジェクトオーナーだけが、組み込み関数を置き換える権限を持ちます。 組み込み関数を置き換えるカスタム関数を使用すると、SQL の実行後、サマリに警告情報が表示されます。
- 登録した関数を SQL で使用します。
select test_lower('A') from my_test_table;
- プロジェクトを作成します。
UDAF の例
package org.alidata.odps.udf.examples;
import com.aliyun.odps.io.LongWritable;
import com.aliyun.odps.io.Text;
import com.aliyun.odps.io.Writable;
import com.aliyun.odps.udf.Aggregator;
import com.aliyun.odps.udf.UDFException;
/**
* project: example_project
* table: wc_in2
* partitions: p2=1,p1=2
* columns: colc,colb,cola
*/
public class UDAFExample extends Aggregator {
@Override
public void iterate(Writable arg0, Writable[] arg1) throws UDFException {
LongWritable result = (LongWritable) arg0;
for (Writable item : arg1) {
Text txt = (Text) item;
result.set(result.get() + txt.getLength());
}
}
@Override
public void merge(Writable arg0, Writable arg1) throws UDFException {
LongWritable result = (LongWritable) arg0;
LongWritable partial = (LongWritable) arg1;
result.set(result.get() + partial.get());
}
@Override
public Writable newBuffer() {
return new LongWritable(0L);
}
@Override
public Writable terminate(Writable arg0) throws UDFException {
return arg0;
}
}
UDTF の例
package org.alidata.odps.udtf.examples;
import com.aliyun.odps.udf.UDTF;
Import com. aliyun. ODPS. UDF. udtfcollector;
import com.aliyun.odps.udf.annotation.Resolve;
import com.aliyun.odps.udf.UDFException;
// TODO define input and output types, e.g., "string,string->string,bigint".
@ Resolve ({"string, bigint-> string, bigint "})
public class MyUDTF extends UDTF {
@Override
public void process(Object[] args) throws UDFException {
String A = (string) ARGs [0];
Long B = (long) ARGs [1];
For (string T: A. Split ("\ s + ")){
Forward (T, B );
}
}
}
MaxCompute には、ユーザーのコンピューティングニーズを満たす数多くの組み込み関数が実装されていますが、カスタム関数を作成することもできます。 詳細は、「UDF の作成 (Create UDFs)」をご参照ください。