Une fonction d'agrégation définie par l'utilisateur (UDAF) transforme plusieurs enregistrements d'entrée en une seule valeur de sortie. Utilisez les UDAF lorsqu'aucune fonction d'agrégation intégrée ne répond à votre logique d'agrégation. MaxCompute prend en charge les UDAF écrites en Java ou en Python.
Quand utiliser une UDAF
Les fonctions intégrées sont optimisées pour le traitement distribué et offrent de meilleures performances que les UDAF. Privilégiez une fonction intégrée si elle répond à votre besoin.
Développez une UDAF lorsque votre logique d'agrégation est impossible à exprimer avec des fonctions intégrées, par exemple pour des modèles statistiques personnalisés, des scores métier spécifiques ou des agrégations pondérées sur plusieurs champs.
Types d'UDAF
| Type | Langage | Runtime |
|---|---|---|
| UDAF Java | Java | JVM |
| UDAF Python 2 | Python | Python 2.7 |
| UDAF Python 3 | Python | CPython 3.7.3 |
Pour les détails d'implémentation, consultez les rubriques UDAF Java, UDAF Python 2 et UDAF Python 3.
Processus de développement
UDAF Java
La figure suivante illustre le flux de travail de développement d'une UDAF Java.

| Étape | Requis | Description | Plateforme | Références |
|---|---|---|---|---|
| 1 | Non | Ajoutez la dépendance SDK odps-sdk-udf à votre fichier POM. Exemple : <dependency><groupId>com.aliyun.odps</groupId><artifactId>odps-sdk-udf</artifactId><version>0.29.10-public</version></dependency>. Recherchez la dernière version dans les dépôts Maven. |
IntelliJ IDEA (Maven) | — |
| 2 | Oui | Développez l'UDAF. | IntelliJ IDEA (Maven) et MaxCompute Studio | Développement d'une UDF en Java |
| 3 | Oui | Déboguez l'UDAF en local ou via des tests unitaires. | — | — |
| 4 | Oui | Empaquetez le code dans un fichier JAR. | — | — |
| 5 | Oui | Téléchargez le fichier JAR en tant que ressource dans votre projet MaxCompute. | Client MaxCompute (odpscmd), MaxCompute Studio, DataWorks | Client MaxCompute : Ajout de ressources, Création d'une UDF ; MaxCompute Studio : Empaquetage d'un programme Java, téléchargement du package et création d'une UDF MaxCompute ; DataWorks : Création et utilisation de ressources MaxCompute, Création et utilisation d'une fonction MaxCompute |
| 6 | Oui | Créez une UDF à partir du fichier JAR téléchargé. | — | — |
| 7 | Non | Appelez l'UDAF dans une requête. | — | — |
UDAF Python
La figure suivante illustre le flux de travail de développement d'une UDAF Python.

| Étape | Requis | Description | Plateforme | Références |
|---|---|---|---|---|
| 1 | Oui | Développez l'UDAF. | MaxCompute Studio | Développement d'une UDF Python |
| 2 | Oui | Déboguez l'UDAF en local ou via des tests unitaires. | — | — |
| 3 | Oui | Téléchargez les fichiers Python et les ressources requises (fichiers, tables, packages tiers) dans votre projet MaxCompute. | Client MaxCompute (odpscmd), MaxCompute Studio, DataWorks | Client MaxCompute : Ajout de ressources, Création d'une UDF ; MaxCompute Studio : Téléchargement d'un programme Python et création d'une UDF MaxCompute ; DataWorks : Utilisation de ressources pour enregistrer des fonctions |
| 4 | Oui | Créez une UDF à partir des fichiers Python ou des ressources téléchargés. | — | — |
| 5 | Non | Appelez l'UDAF dans une requête. | — | — |
Limites
Les UDAF n'ont pas accès à Internet. Pour activer cet accès, soumettez une demande de connexion réseau. Après approbation, l'équipe d'assistance technique MaxCompute configurera la connexion pour vous. Pour plus de détails, consultez la rubrique Processus de connexion réseau.
Notes d'utilisation
Performance : Les fonctions intégrées offrent de meilleures performances que les UDAF. Privilégiez une fonction intégrée si elle répond à votre besoin.
-
Mémoire : Si une instruction SQL utilisant une UDAF dépasse l'allocation de mémoire par défaut en raison de volumes de données importants ou d'une distorsion des données, exécutez la commande suivante au niveau de la session pour augmenter la limite :
set odps.sql.udf.joiner.jvm.memory=xxxx;Pour plus d'informations, consultez la rubrique FAQ sur les UDF MaxCompute.
Conflit de noms : Si une UDAF porte le même nom qu'une fonction intégrée, MaxCompute appelle l'UDAF. Pour appeler la fonction intégrée à la place, préfixez-la avec
::, par exemple :select ::concat('ab', 'c');
Appel d'une UDAF
Au sein du même projet : Appelez l'UDAF comme vous le feriez pour une fonction intégrée.
Entre projets : Utilisez le nom du projet comme préfixe. L'exemple suivant appelle udf_in_other_project du projet B depuis le projet A :
select B:udf_in_other_project(arg0, arg1) as res from table_t;
Pour configurer le partage de ressources entre projets, consultez la rubrique Accès aux ressources entre projets basé sur les packages.