Tous les produits
Search
Centre de documentation

MaxCompute:Exemple : Utiliser une UDF Hive compatible avec la version Hive de MaxCompute

Dernière mise à jour :Aug 10, 2026

Utilisez directement sur le client MaxCompute une fonction définie par l'utilisateur (UDF) Hive compatible avec la version Hive de MaxCompute, sans réécriture nécessaire.

Prérequis

Avant de commencer, assurez-vous d'avoir :

Exemple de code

La classe Java suivante Collect étend GenericUDF pour regrouper plusieurs arguments du même type de données dans un tableau. Utilisez-la comme base pour votre UDF 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";
  }
}

Dans cet exemple, le fichier JAR compilé à partir de cette classe se nomme test.jar.

Enregistrer et appeler l'UDF

  1. Installez et démarrez le client MaxCompute.

  2. Empaquetez l'exemple de code dans un fichier JAR à l'aide de Hive, puis ajoutez-le en tant que ressource MaxCompute :

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

    Spécifiez explicitement tous les fichiers JAR dans la commande ADD JAR. MaxCompute n'ajoute pas automatiquement les fichiers JAR au classpath.

    Pour plus de détails sur l'ajout de ressources, consultez Ajouter des ressources.

  3. Créez une fonction qui correspond à votre classe UDF :

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

    Pour plus d'informations, consultez Créer une UDF.

  4. Activez le mode de compatibilité Hive et appelez l'UDF. Soumettez les deux commandes ensemble lors d'une seule exécution :

    Remarque

    Ajoutez set odps.sql.hive.compatible=true; avant toute instruction SQL appelant une UDF Hive, et soumettez les deux lignes ensemble.

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

    Le résultat attendu est le suivant :

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

Notes d'utilisation

  • Sandbox Java : Les UDF Hive s'exécutant dans un environnement distribué sont soumises à la sandbox Java de MaxCompute. Consultez Sandbox Java.

  • Délai d'expiration du démarrage du processus : Chaque appel d'UDF démarre un nouveau processus. Si les ressources du cluster sont insuffisantes, l'UDF risque d'échouer en raison d'un délai d'expiration du démarrage du processus.