Si les fonctions intégrées de MaxCompute ne répondent pas à vos besoins, créez une fonction définie par l'utilisateur (UDF) en Java à l'aide d'un outil de développement tel qu'IntelliJ IDEA (Maven) ou MaxCompute Studio, puis appelez cette UDF dans des instructions SQL MaxCompute.
Limites strictes
Accès Internet — Par défaut, les UDF ne peuvent pas accéder à Internet. Pour activer l'accès Internet, soumettez une demande de connexion réseau. Après approbation, l'équipe d'assistance technique MaxCompute vous contactera pour établir la connexion. Pour plus de détails, consultez le Network Connection Request FormProcessus de connexion réseau.
Accès VPC — Par défaut, les UDF ne peuvent pas accéder aux ressources d'un cloud privé virtuel (VPC). Pour activer l'accès VPC, établissez une connexion réseau entre MaxCompute et le VPC. Pour plus de détails, consultez Utiliser des UDF pour accéder aux ressources dans les VPC.
Types de tables non pris en charge — Les UDF, UDAF et UDTF ne peuvent pas lire les données des types de tables suivants :
Tables ayant fait l'objet d'une évolution de schéma
Tables contenant des types de données complexes
Tables contenant des types de données JSON
Tables transactionnelles
Remarques d'utilisation
Avant d'écrire une UDF Java, familiarisez-vous avec la structure du code UDF et les correspondances de types de données entre Java et MaxCompute. Pour plus d'informations, consultez l'Annexe : Types de données.
Lorsque vous écrivez une UDF Java, tenez compte des points suivants :
Évitez d'inclure des classes portant le même nom mais implémentant une logique différente dans différents fichiers JAR d'UDF. Par exemple, si UDF1 et UDF2 correspondent respectivement à udf1.jar et udf2.jar, et que les deux fichiers JAR contiennent
com.aliyun.UserFunction.classavec une logique différente, l'appel simultané des deux UDF dans la même instruction SQL amène MaxCompute à charger aléatoirement l'une des classes. Cela peut entraîner des résultats inattendus ou un échec de compilation.Dans une UDF Java, les paramètres d'entrée et les valeurs de retour doivent utiliser des types objet (tels que String et Long), et non des types primitifs (tels que int et long).
Les valeurs NULL en SQL correspondent à NULL en Java. Les types primitifs Java ne pouvant pas représenter les valeurs NULL, leur utilisation n'est pas autorisée.
Flux de travail de développement d'UDF
Le développement d'une UDF comprend plusieurs étapes : préparation de l'environnement, écriture du code UDF, téléchargement du fichier JAR, enregistrement de l'UDF et débogage. Les sections suivantes illustrent ce flux de travail avec MaxCompute Studio, DataWorks et odpscmd.
Utiliser MaxCompute Studio
L'exemple suivant montre comment développer et appeler une UDF Java qui convertit les caractères en minuscules à l'aide de MaxCompute Studio.
-
Préparez l'environnement.
Avant de pouvoir développer et déboguer une UDF dans MaxCompute Studio, installez MaxCompute Studio et connectez-le à un projet MaxCompute. Pour plus d'informations, consultez les rubriques suivantes :
-
Écrivez le code de l'UDF.
Dans l'explorateur Project, cliquez avec le bouton droit sur le répertoire de code source du module () et sélectionnez .

-
Dans la boîte de dialogue Create new MaxCompute java class, cliquez sur UDF, saisissez un nom de classe dans le champ Name, puis appuyez sur Entrée.

Name spécifie le nom de la classe Java MaxCompute à créer. Si vous n'avez pas créé de package, saisissez packagename.classname pour en créer un automatiquement. Dans cet exemple, la classe est nommée Lower.
-
Rédigez le code de l'UDF dans l'éditeur de code.
Par exemple :package com.aliyun.odps.udf.example; import com.aliyun.odps.udf.UDF; public final class Lower extends UDF { public String evaluate(String s) { if (s == null) { return null; } return s.toLowerCase(); } }RemarquePour déboguer localement l'UDF Java, consultez Développer et déboguer des UDF.
-
Téléchargez et enregistrez l'UDF.
Cliquez avec le bouton droit sur le fichier Java de l'UDF et sélectionnez Deploy to server.... Dans la boîte de dialogue Package a jar, submit resource and register function, configurez les paramètres et cliquez sur OK.

MaxCompute project : Projet MaxCompute auquel appartient l'UDF. Étant donné que l'UDF est écrite dans le projet MaxCompute connecté, vous pouvez conserver la valeur par défaut.
Resource file : Chemin d'accès au fichier de ressource dont dépend l'UDF. Vous pouvez conserver la valeur par défaut.
Resource name : Ressource dont dépend l'UDF. Vous pouvez conserver la valeur par défaut.
Function name : Nom utilisé pour appeler l'UDF dans les instructions SQL. Par exemple, Lower_test.
-
Déboguez l'UDF.
Dans le volet de navigation de gauche, cliquez sur Project Explore. Cliquez avec le bouton droit sur le projet MaxCompute cible et sélectionnez Open Console. Dans la console, saisissez l'instruction SQL qui appelle l'UDF et appuyez sur Entrée.
Par exemple :select lower_test('ABC');Le résultat suivant s'affiche.
+-----+ | _c0 | +-----+ | abc | +-----+
Utiliser DataWorks
-
Préparez l'environnement.
Avant de pouvoir développer et déboguer une UDF dans DataWorks, activez DataWorks et liez-y un projet MaxCompute. Pour plus d'informations, consultez Utiliser DataWorks.
-
Écrivez le code de l'UDF.
Vous pouvez écrire le code de l'UDF dans n'importe quel outil de développement Java et l'empaqueter sous forme de fichier JAR. Par exemple :
package com.aliyun.odps.udf.example; import com.aliyun.odps.udf.UDF; public final class Lower extends UDF { public String evaluate(String s) { if (s == null) { return null; } return s.toLowerCase(); } } -
Téléchargez et enregistrez l'UDF.
Téléchargez le code empaqueté vers DataWorks et enregistrez l'UDF. Pour plus d'informations, consultez les rubriques suivantes :
-
Déboguez l'UDF.
Après avoir enregistré l'UDF, créez un nœud ODPS SQL et exécutez une instruction SQL dans ce nœud pour déboguer l'UDF. Pour plus d'informations sur la création d'un nœud ODPS SQL, consultez Créer un nœud ODPS SQL. Exemple :
select lower_test('ABC');
Utiliser odpscmd
-
Préparez l'environnement.
Pour développer et déboguer une UDF à l'aide d'odpscmd, installez le client et configurez sa connexion à un projet MaxCompute. Pour plus d'informations, consultez Utiliser le client MaxCompute (odpscmd).
-
Écrivez le code de l'UDF.
Vous pouvez écrire le code de l'UDF dans n'importe quel outil de développement Java et l'empaqueter sous forme de fichier JAR. Par exemple :
package com.aliyun.odps.udf.example; import com.aliyun.odps.udf.UDF; public final class Lower extends UDF { public String evaluate(String s) { if (s == null) { return null; } return s.toLowerCase(); } } -
Téléchargez et enregistrez l'UDF.
Téléchargez le code empaqueté à l'aide d'odpscmd et enregistrez l'UDF. Pour plus d'informations, consultez :
-
Déboguez l'UDF.
Après avoir enregistré l'UDF, rédigez et exécutez une instruction SQL pour la déboguer. Exemple :
select lower_test('ABC');
Appel d'UDF
Une fois que vous avez développé une UDF Java comme décrit dans le flux de travail de développement d'UDF, vous pouvez l'appeler dans SQL MaxCompute. Les méthodes suivantes sont disponibles :
Au sein d'un projet — Appelez l'UDF directement, comme toute fonction intégrée.
-
Entre projets — Pour utiliser une UDF du projet B dans le projet A, référencez-la avec le préfixe du projet :
select B:udf_in_other_project(arg0, arg1) as res from table_t;Pour la configuration du partage interprojets, consultez Accès aux ressources interprojets basé sur les packages.
Exemples d'UDF
Exemple : Utiliser une UDF Hive dont la version Hive est compatible avec MaxCompute
Exemple : Utiliser des types de données complexes dans les UDF
Exemple : Remplacer une chaîne à l'aide d'une expression régulière
Exemple : Extraire une valeur d'une chaîne contenant un séparateur
Exemple : Obtenir un caractère à une position spécifiée dans une URL
Annexe : Structure du code UDF
Une UDF Java se compose des éléments suivants :
-
Package Java : Facultatif.
Vous pouvez regrouper vos classes Java dans un package pour faciliter leur réutilisation et leur organisation.
-
Héritage de la classe UDF : Obligatoire.
La classe de base requise est
com.aliyun.odps.udf.UDF. Si vous avez besoin d'autres classes UDF ou de types de données complexes, ajoutez les classes requises du SDK MaxCompute. Par exemple, la classe pour le type de données STRUCT estcom.aliyun.odps.data.Struct. -
Annotation
@Resolve: Facultative.Le format est
@Resolve(<signature>), oùsignaturedéfinit les types de données des paramètres d'entrée et de la valeur de retour. Lorsque vous utilisez le type de données STRUCT dans une UDF, la réflexion ne permet pas de récupérer les noms et les types de champs depuiscom.aliyun.odps.data.Struct. Dans ce cas, vous devez utiliser l'annotation@Resolvepour les récupérer. Si vous utilisez STRUCT dans une UDF, ajoutez l'annotation@Resolveà la classe UDF. L'annotation affecte uniquement les surcharges dont les paramètres ou les valeurs de retour contiennent com.aliyun.odps.data.Struct. Exemple :@Resolve("struct<a:string>,string->string"). Pour un exemple détaillé, consultez Exemple d'UDF : Types de données complexes. -
Classe Java personnalisée : Obligatoire.
Il s'agit de l'unité qui organise votre code UDF et définit les variables et méthodes implémentant votre logique métier.
-
Méthode
evaluate: Obligatoire.Votre classe Java personnalisée doit inclure une méthode publique non statique
evaluate. Les types de données de ses paramètres d'entrée et de sa valeur de retour définissent la signature SQL de l'UDF.Vous pouvez implémenter plusieurs méthodes
evaluate. Lors de l'appel de l'UDF, MaxCompute sélectionne la méthodeevaluatecorrespondante en fonction des types d'arguments.Lorsque vous écrivez une UDF Java, vous pouvez utiliser des types Java ou des types Java Writable. Pour les correspondances détaillées entre les types de données MaxCompute et les types de données Java, consultez l'Annexe : Types de données.
Initialisation et nettoyage de l'UDF : Facultatifs. Vous pouvez implémenter l'initialisation et le nettoyage à l'aide de
void setup(ExecutionContext ctx)etvoid close(). La méthodevoid setup(ExecutionContext ctx)est appelée une fois avant la méthodeevaluateet peut être utilisée pour initialiser les ressources ou les objets membres requis pour le calcul. La méthodevoid close()est appelée une fois après l'exécution de tous les appelsevaluateet sert aux tâches de nettoyage, telles que la fermeture de fichiers.
Les exemples suivants montrent deux types d'UDF.
-
Utiliser des types Java
// Organize the Java class in the org.alidata.odps.udf.examples package. package org.alidata.odps.udf.examples; // Inherit the UDF class. import com.aliyun.odps.udf.UDF; // Define a custom Java class. public final class Lower extends UDF { // The evaluate method defines the UDF's logic. It takes a String and returns a String. public String evaluate(String s) { if (s == null) { return null; } return s.toLowerCase(); } } -
Utiliser des types Java Writable
// Organize the Java class in the com.aliyun.odps.udf.example package. package com.aliyun.odps.udf.example; // Add the required classes for the Java Writable type. import com.aliyun.odps.io.Text; // Inherit the UDF class. import com.aliyun.odps.udf.UDF; // Define a custom Java class. public class MyConcat extends UDF { private Text ret = new Text(); // Define the evaluate method. `Text` specifies the data type of the input parameters, and the `return` value is also a Text object. public Text evaluate(Text a, Text b) { if (a == null || b == null) { return null; } ret.clear(); ret.append(a.getBytes(), 0, a.getLength()); ret.append(b.getBytes(), 0, b.getLength()); return ret; } }
MaxCompute prend également en charge les UDF développées pour sa version Hive compatible. Pour plus d'informations, consultez la section Compatibilité des UDF Hive.
Annexe : Types de données
Correspondances de types de données
Pour garantir la cohérence entre les types de données utilisés dans une UDF Java et les types de données MaxCompute, utilisez les correspondances suivantes.
Les types de données pris en charge par MaxCompute varient selon l'édition de type de données. À partir de MaxCompute 2.0, des types de données supplémentaires sont disponibles, y compris des types complexes tels que ARRAY, MAP et STRUCT. Pour plus d'informations, consultez Éditions de types de données.
|
Type MaxCompute |
Type Java |
Type Java Writable |
|
TINYINT |
java.lang.Byte |
ByteWritable |
|
SMALLINT |
java.lang.Short |
ShortWritable |
|
INT |
java.lang.Integer |
IntWritable |
|
BIGINT |
java.lang.Long |
LongWritable |
|
FLOAT |
java.lang.Float |
FloatWritable |
|
DOUBLE |
java.lang.Double |
DoubleWritable |
|
DECIMAL |
java.math.BigDecimal |
BigDecimalWritable |
|
BOOLEAN |
java.lang.Boolean |
BooleanWritable |
|
STRING |
java.lang.String |
Text |
|
VARCHAR |
com.aliyun.odps.data.Varchar |
VarcharWritable |
|
BINARY |
com.aliyun.odps.data.Binary |
BytesWritable |
|
DATE |
java.sql.Date |
DateWritable |
|
DATETIME |
java.util.Date |
DatetimeWritable |
|
TIMESTAMP |
java.sql.Timestamp |
TimestampWritable |
|
INTERVAL_YEAR_MONTH |
N/A |
IntervalYearMonthWritable |
|
INTERVAL_DAY_TIME |
N/A |
IntervalDayTimeWritable |
|
ARRAY |
java.util.List |
N/A |
|
MAP |
java.util.Map |
N/A |
|
STRUCT |
com.aliyun.odps.data.Struct |
N/A |
Le type Java byte[] ne figure pas dans la liste des types Java pris en charge. Si vous utilisez byte[] pour un paramètre d'entrée ou la valeur de retour d'une méthode evaluate, une erreur ODPS-0130071 est signalée. Pour traiter des données binaires dans une UDF, utilisez les types Java correspondant au type BINARY de MaxCompute : com.aliyun.odps.data.Binary pour le type Java standard, ou com.aliyun.odps.io.BytesWritable pour le type Writable. Vous pouvez également convertir les données binaires en une chaîne encodée en Base64 et utiliser le type String pour la valeur de retour.
Compatibilité des UDF Hive
Si votre projet MaxCompute utilise l'édition de type de données 2.0, MaxCompute prend en charge les UDF de style Hive. Vous pouvez utiliser directement les UDF Hive développées pour une version Hive compatible.
La version Hive compatible est la 2.1.0, qui correspond à Hadoop 2.7.2. Si votre UDF a été compilée avec une version différente de Hive ou Hadoop, recompilez le fichier JAR de l'UDF avec Hive 2.1.0 ou Hadoop 2.7.2.
Pour un exemple détaillé d'utilisation d'une UDF Hive dans MaxCompute, consultez Exemple d'UDF : Compatibilité Hive.