全部產品
Search
文件中心

MaxCompute:UDF樣本:相容Hive

更新時間:Jun 19, 2024

本文以在MaxCompute用戶端操作為例,為您介紹如何使用在MaxCompute相容的Hive版本上開發的Hive UDF。

前提條件

已安裝MaxCompute用戶端。更多安裝操作,請參見安裝並配置MaxCompute用戶端

注意事項

使用相容的Hive UDF時,您需要注意:

  • 在MaxCompute上使用add jar命令添加Hive UDF的資源時,您需要指定所有JAR包,MaxCompute無法自動將所有JAR包加入Classpath。

  • 調用Hive UDF時,需要在SQL語句前添加set odps.sql.hive.compatible=true;語句,與SQL語句一起提交執行。

  • Java UDF在分布式環境中運行時,請注意MaxCompute的Java沙箱限制。

  • UDF會起新進程計算,當叢集資源緊張時,會有小機率因新進程啟動排隊逾時而失敗。

Hive UDF程式碼範例

Hive 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";
  }
}

該UDF程式碼範例可以將任意類型、數量的參數打包成ARRAY輸出。假設Hive UDF對應的JAR包名稱為test.jar。

操作步驟

  1. 安裝並登入MaxCompute本地用戶端

  2. Hive UDF程式碼範例通過Hive平台編譯為JAR包,執行如下命令將Hive UDF JAR包添加為MaxCompute資源。

    --添加資源。
    add jar test.jar;

    更多添加資源資訊,請參見添加資源

  3. 執行如下命令註冊UDF函數。

    --註冊函數。
    create function hive_collect as 'com.aliyun.odps.compiler.hive.Collect' using 'test.jar';

    更多註冊函數資訊,請參見註冊函數

  4. 執行如下SQL語句調用建立的UDF函數。

    --設定MaxCompute專案的模式為Hive相容模式。
    set odps.sql.hive.compatible=true;
    --調用UDF函數。
    select hive_collect(4y, 5y, 6y);

    返回結果如下。

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