UDF

最終更新日: Nov 26, 2017

MaxCompute UDFには、UDF、UDAF、UDTFがあります。通常、これらの3種類の関数はUDFと呼ばれています。Mavenを使用するユーザーは、Maven Libraryの “odps-sdk-udf”を検索して、異なるバージョンのJava SDKを入手できます。関連する構成を以下に示します。

  1. <dependency>
  2. <groupid> com.aliyun.odps </groupid>
  3. <artifactid> odps-sdk-udf </artifactid>
  4. <version>0.20.7-public</version>
  5. </dependency>

注意:

  • UDFは現在、Java言語のみをサポートしています。UDFプログラムを作成したい場合は、Add ResourceでUDFコードをプロジェクトにアップロードし、Create FunctionでUDFを作成することができます。
  • このセクションでは、UDF、UDAF、およびUDTFのコード例を個別に示します。UDFを実行するには、UDF Eclipse Plug-in Introductionを参照してください。
  • UDFを使用する必要がある場合は、odpsプロジェクト名とアプリケーションシナリオを提供して、workorderシステムでアプリケーションを提出する必要があります。アプリケーションが渡された後、UDFを使用できます。

UDFの例

UDFの開発例全体を以下に示します。たとえば、小文字の変換を実現するためにUDFを開発するには、次の手順を実行します。

  • コーディング:ODPS UDFフレームワークに従ってUDF機能を実現し、コンパイルします。次は簡単なコーディング例です:
  1. package org.alidata.odps.udf.examples;
  2. import com.aliyun.odps.udf.UDF;
  3. public final class Lower extends UDF {
  4. public String evaluate(String s) {
  5. if (s == null) { return null; }
  6. return s.toLowerCase();
  7. }
  8. }
  • このjarパッケージのmy_lower.jarを指定します。

注意:

  • SDKの情報については、UDF SDKを参照してください。
  • リソースの追加:UDFを実行する前に、参照されているUDFコードを指定する必要があります。ユーザコードは、リソースの形でODPSに追加されます。Java UDFはjarパッケージにして、jarリソースの形式でODPSに追加する必要があります。UDFframeworkは自動的にjarパッケージをロードし、UDFを実行します。MaxCompute MapReduceには、リソースの使用方法も記載されています。

  • 次のコマンドを実行します。

  1. add jar my_lower.jar;
  2. -- If the resource name has existed, rename the jar package.
  3. -- Pay attention to modifying related name of jar package in following command.
  4. -- Or use f option directly to overwrite original jar resource.
  • Register UDF:MaxComputeは、jarパッケージをアップロードした後、ユーザーコードを取得して実行することができます。しかし、このUDFはMaxComputeにこのUDFに関する情報がないため使用できません。ユーザーは、ODPSに一意の関数名を登録し、この関数名に対応する関数をjarリソースと指定する必要があります。UDFの登録については、Create Functionを参照してください。次のコマンドを実行します。
  1. CREATE FUNCTION test_lower AS org.alidata.odps.udf.examples.Lower USING my_lower.jar;

SQLでこの関数を使用します。

  1. select test_lower('A') from my_test_table;

UDAFの例

UDAFの登録メソッドはUDFに似ています。その使い方は組み込み関数の集合関数と同じです。次に、平均を計算するためのUDAFコード例を示します。

  1. package org.alidata.odps.udf.examples;
  2. import com.aliyun.odps.io.LongWritable;
  3. import com.aliyun.odps.io.Text;
  4. import com.aliyun.odps.io.Writable;
  5. import com.aliyun.odps.udf.Aggregator;
  6. import com.aliyun.odps.udf.UDFException;
  7. /**
  8. *プロジェクト:example_project
  9. *テーブル:wc_in2
  10. *パーティション:p2 = 1、p1 = 2
  11. *カラム:colc、colb、cola
  12. */
  13. public class UDAFExample extends Aggregator {
  14. @Override
  15. public void iterate(Writable arg0, Writable[] arg1) throws UDFException {
  16. LongWritable result = (LongWritable) arg0;
  17. for (Writable item : arg1) {
  18. Text txt = (Text) item;
  19. result.set(result.get() + txt.getLength());
  20. }
  21. }
  22. @Override
  23. public void merge(Writable arg0, Writable arg1) throws UDFException {
  24. LongWritable result = (LongWritable) arg0;
  25. LongWritable partial = (LongWritable) arg1;
  26. result.set(result.get() + partial.get());
  27. }
  28. @Override
  29. public Writable newBuffer() {
  30. return new LongWritable(0L);
  31. }
  32. @Override
  33. public Writable terminate(Writable arg0) throws UDFException {
  34. return arg0;
  35. }
  36. }

UDTFの例

UDTFの登録メソッドはUDFに似ています。その使用法はUDFと同じです。コード例を次に示します。

  1. package org.alidata.odps.udtf.examples;
  2. import com.aliyun.odps.udf.UDTF;
  3. import com.aliyun.odps.udf.UDTFCollector;
  4. import com.aliyun.odps.udf.annotation.Resolve;
  5. import com.aliyun.odps.udf.UDFException;
  6. // TODO define input and output types, e.g., "string,string->string,bigint".
  7. @Resolve({"string,bigint->string,bigint"})
  8. public class MyUDTF extends UDTF {
  9. @Override
  10. public void process(Object[] args) throws UDFException {
  11. String a = (String) args[0];
  12. Long b = (Long) args[1];
  13. for (String t: a.split("\\s+")) {
  14. forward(t, b);
  15. }
  16. }
  17. }