Todos os produtos
Search
Central de documentação

MaxCompute:Exemplo: Uso de uma UDF do Hive com versão compatível com o MaxCompute

Última atualização: Jun 26, 2026

Use uma função definida pelo usuário (UDF) do Hive compatível com a versão do Hive do MaxCompute diretamente no cliente MaxCompute, sem necessidade de reescrita.

Pré-requisitos

Antes de começar, verifique se você tem:

Código de exemplo

A classe Java a seguir, Collect, estende GenericUDF para agrupar vários argumentos do mesmo tipo de dados em um array. Use este código como base para sua UDF do Hive.

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

Neste exemplo, o arquivo JAR compilado desta classe chama-se test.jar.

Registrar e chamar a UDF

  1. Instale e inicie o cliente MaxCompute.

  2. Empacote o código de exemplo em um arquivo JAR usando o Hive e adicione-o como recurso do MaxCompute:

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

    Especifique todos os arquivos JAR explicitamente no comando ADD JAR. O MaxCompute não adiciona arquivos JAR automaticamente ao classpath.

    Para obter detalhes sobre como adicionar recursos, consulte Adicionar recursos.

  3. Crie uma função que aponte para sua classe UDF:

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

    Para mais informações, consulte Criar uma UDF.

  4. Ative o modo de compatibilidade com Hive e chame a UDF. Envie ambos os comandos juntos em uma única execução:

    Nota

    Adicione set odps.sql.hive.compatible=true; antes de qualquer instrução SQL que chame uma UDF do Hive e envie ambas as linhas juntas.

    -- 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);

    Saída esperada:

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

Observações de uso

  • Sandbox Java: As UDFs do Hive executadas em ambiente distribuído estão sujeitas à sandbox Java do MaxCompute. Consulte Sandbox Java.

  • Timeout de inicialização de processo: Cada chamada de UDF inicia um novo processo. Se os recursos do cluster forem insuficientes, há uma pequena probabilidade de falha na execução da UDF devido a timeout na inicialização do processo.