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 :
Installé et configuré le client MaxCompute. Consultez Installer et configurer le client MaxCompute
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
-
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;ImportantSpé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.
-
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.
-
Activez le mode de compatibilité Hive et appelez l'UDF. Soumettez les deux commandes ensemble lors d'une seule exécution :
RemarqueAjoutez
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.