edit-icon download-icon

UDF

最終更新日: Jun 08, 2018

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プログラムを作成したい場合は、リソースの追加でUDFコードをプロジェクトにアップロードし、関数の追加でUDFを作成することができます。
  • このセクションでは、UDF、UDAF、およびUDTFのコード例を個別に示します。UDFを実行するには、UDFを参照してください。
  • UDFを使用する必要がある場合は、MaxCompute プロジェクト名とアプリケーションシナリオを提供して、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 概要を参照してください。
  • リソースの追加:UDF を実行する前に、参照されているUDF コードを指定する必要があります。ユーザコードは、リソースの形式でMaxCompute に追加されます。Java UDF はjar パッケージにして、jarリソースの形式でMaxCompute に追加する必要があります。UDFframework は自動的にjar パッケージをロードし、UDFを実行します。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パッケージをアップロードした後、ユーザーコードを取得して実行することができます。ただし、MaxComputeにはこのUDFに関する情報がないため使用できません。ユーザーは、MaxCompute に一意の関数名を登録し、この関数名に対応する関数を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. }