すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:例: HiveバージョンがMaxComputeと互換性のあるHive UDFを使用する

最終更新日:Jan 06, 2025

このトピックでは、HiveバージョンがMaxComputeと互換性のあるHiveユーザー定義関数 (UDF) をMaxComputeクライアントで使用する方法について説明します。

前提条件

MaxComputeクライアントがインストールされています。 詳細については、「MaxComputeクライアントのインストールと設定」をご参照ください。

注意事項

Hive UDFを使用する前に、次の点に注意してください。

  • ADD JARコマンドを実行してMaxComputeクライアントでHive UDFのリソースパッケージを追加する場合は、追加するすべてのJARファイルを指定する必要があります。 これは、MaxComputeがすべてのJARファイルをクラスパスに自動的に追加できないためです。

  • Hive UDFを呼び出すには、実行するSQL文の前にse t odps.sql.hive.com patible=true; コマンドを追加する必要があります。 次に, コマンドとSQL文を一緒にコミットして実行してください。

  • Java UDFが分散環境で実行される場合、UDFはMaxComputeのJavaサンドボックスによって制限されます。 詳細は、「Javaサンドボックス」をご参照ください。

  • UDFは、計算のための新しいプロセスを開始する。 クラスターリソースが不十分な場合、新しいプロセスの起動のタイムアウトによりUDFの実行が失敗する可能性は低くなります。

サンプルコード

サンプルコード:

package com.aliyun.odps.compiler.hive;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class Collect extends GenericUDF {
  @Override
  public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {
    if (objectInspectors.length == 0) {
      throw new UDFArgumentException("Collect: input args should >= 1");
    }
    for (int i = 1; i < objectInspectors.length; i++) {
      if (objectInspectors[i] != objectInspectors[0]) {
        throw new UDFArgumentException("Collect: input oi should be the same for all args");
      }
    }
    return ObjectInspectorFactory.getStandardListObjectInspector(objectInspectors[0]);
  }
  @Override
  public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {
    List<Object> objectList = new ArrayList<>(deferredObjects.length);
    for (DeferredObject deferredObject : deferredObjects) {
      objectList.add(deferredObject.get());
    }
    return objectList;
  }
  @Override
  public String getDisplayString(String[] strings) {
    return "Collect";
  }
}

上記のコードは、任意のデータ型のランダムな数のパラメーターを配列にパッケージ化します。 この例では、Hive UDFのJARファイルの名前はtest.jarです。

手順

  1. MaxComputeクライアントをインストールして起動します。

  2. Hiveを使用してサンプルコードをJARファイルにパッケージ化します。 次に、次のコマンドを実行して、JARファイルをMaxComputeリソースとして追加します。

    -- Add the JAR file as a MaxCompute resource. 
    add jar test.jar;

    リソースの追加方法の詳細については、「リソースの追加」をご参照ください。

  3. 次のコマンドを実行してUDFを作成します。

    -- Create a UDF. 
    create function hive_collect as 'com.aliyun.odps.compiler.hive.Collect' using 'test.jar';

    UDFの作成方法の詳細については、「UDFの作成」をご参照ください。

  4. 次のコマンドを実行してUDFを呼び出します。

    -- Enable the Hive-compatible data type edition for the MaxCompute project. 
    set odps.sql.hive.compatible=true;
    -- Call the UDF. 
    select hive_collect(4y, 5y, 6y);

    次の応答が返されます。

    +------+
    | _c0  |
    +------+
    | [4, 5, 6] |
    +------+