UDF示例:兼容Hive

本文以在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] |
    +------+