MaxCompute のユーザー定義関数 (UDF) には、UDF (User Defined Scalar Functions)、UDAF User (Defined Aggregation Function)、UDTF (User Defined Table Valued Function) があります。 通常、これらの関数はすべて UDF と呼ばれます。

Maven ユーザーは、Maven ライブラリodps-sdk-udf を検索すると、必要な Java を入手できます (複数のバージョンが用意されています)。
<dependency>
    <groupId>com.aliyun.odps</groupId>
    <artifactId>odps-sdk-udf</artifactId>
    <version>0.20.7</version>
</dependency>
現在、JAVA UDF は、次の方法で開発できます。
ここでは、UDF、UDAF、UDTF のコード例を個別に紹介します。また、UDF 開発時のプロセス全体の例を 2 通り記載します (UDAF と UDTF の手順は、UDF の手順と同じです)。

UDF の例

以下の例では、 小文字変換を実行するための UDF の開発方法を紹介します。
  • MaxCompute Studio による開発
    1. ツールと環境を準備します。

      MaxCompute Studio のインストール、MaxCompute Studio を使用した MaxCompute プロジェクトリンクの作成、および MaxCompute Java モジュールの作成が含まれます。

    2. プログラムを作成します。
      設定が完了している 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)」をご参照ください。
    3. MaxCompute UDF を登録します
      下図で示す通り、UDF の Java ファイルを右クリックして、[Deploy to server] を選択します。ダイアログボックスで登録先の MaxCompute プロジェクトを選択し、 function name を入力します。 また、 リソース名を変更することもできます。すべての設定が終了したら、[OK] をクリックします。 登録が正しく行われると、プロンプトが表示されます。
    4. UDF を試行します
      SQL スクリプトを開き、select Lower_test(‘ABC’); などのコードを実行します。 下図のような結果が表示されます。
      MaxCompute Studio で SQL スクリプトを作成する場合は、「SQL スクリプトの作成 (writing SQL scripts)」をご参照ください。
  • Eclipse プラグインによる開発
    1. プロジェクトを作成します。

      MaxCompute (旧 ODPS) プロジェクトが、Eclipse プラグインで作成されているものとします。詳細は、「MaxCompute プロジェクトの作成 (creating a MaxCompute project)」をご参照ください。

    2. プログラムを作成します。
      関数をアーカイブするには、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();
      }
      }
      JAR パッケージ名を my_lower.jar にします。
      • デバックコードの開発に関する詳細は、「UDF」をご参照ください。
      • SDK に関する詳細は、「UDF SDK」をご参照ください。
    3. リソースを追加します。
      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.
    4. 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 の実行後、サマリに警告情報が表示されます。
    5. 登録した関数を SQL で使用します。
      select test_lower('A') from my_test_table;

UDAF の例

UDAF の登録方法は、UDF の登録方法と同じです。 使用方法は、集計関数と同じです。 以下は、平均を計算する 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 の例

UDTF の登録方法と使用方法は、UDF と同じです。 コード例

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)」をご参照ください。