Les fonctions définies par l'utilisateur renvoyant une table (UDTF) étendent les capacités natives de MaxCompute en vous permettant d'écrire des fonctions personnalisées en Java ou en Python. Une UDTF lit une ligne d'entrée et renvoie plusieurs lignes ; le résultat est traité comme une table.
MaxCompute inclut certaines UDTF natives, telles que EXPLODE. Pour plus d'informations, consultez Autres fonctions et Fonctions de types complexes.
Quand utiliser les UDTF
Recourez à une UDTF lorsque les fonctions natives ne peuvent pas exprimer votre logique, par exemple si vous devez émettre un nombre variable de lignes de sortie pour chaque ligne d'entrée, ou si votre transformation dépend d'un état accumulé sur plusieurs lignes d'une partition.
Les fonctions natives sont optimisées pour le moteur distribué de MaxCompute et offrent de meilleures performances que les UDTF à grande échelle. Privilégiez les fonctions natives dès qu'elles couvrent votre cas d'utilisation.
Langages pris en charge
| Langage | Version |
|---|---|
| Java | — |
| Python 2 | 2,7 |
| Python 3 | CPython 3.7.3 |
Pour obtenir les détails d'implémentation, consultez UDTF Java, UDTF Python 2 et UDTF Python 3.
Limites
Accès à Internet : par défaut, les UDF n'ont pas accès à Internet. Pour activer l'accès à Internet, remplissez le formulaire de demande de connexion réseau. Après approbation, l'équipe d'assistance technique de MaxCompute vous contactera pour établir la connexion. Pour plus de détails, consultez Processus de connexion réseau.
-
Aucune autre colonne dans la même instruction
SELECT: une instructionSELECTqui appelle une UDTF ne peut pas référencer d'autres colonnes ou expressions. L'instruction suivante n'est pas valide :-- Invalid: mixes a UDTF with another column select value, user_udtf(key) as mycol ... -
Imbrication interdite : les UDTF ne peuvent pas être imbriquées dans d'autres UDTF. L'instruction suivante n'est pas valide :
-- Invalid: user_udtf2 is nested inside user_udtf1 select user_udtf1(user_udtf2(key)) as mycol...; -
Incompatibilité avec
GROUP BY,DISTRIBUTE BYetSORT BY: une UDTF ne peut pas apparaître dans la même instructionSELECTque ces clauses. L'instruction suivante n'est pas valide :-- Invalid: UDTF used with GROUP BY select user_udtf(key) as mycol ... group by mycol;
Remarques sur l'utilisation
Mémoire : si un travail UDF traite de grands volumes de données avec un déséquilibre de charge (data skew), il risque de dépasser l'allocation mémoire JVM par défaut. Exécutez la commande suivante au niveau de la session pour augmenter la mémoire :
set odps.sql.udf.joiner.jvm.memory=xxxx;
Pour consulter la liste complète des rubriques FAQ sur les UDF, voir FAQ sur les UDF MaxCompute.
Conflits de noms : si une UDF porte le même nom qu'une fonction native, MaxCompute appelle la UDF. Pour appeler explicitement la fonction native, faites-la précéder de :: :
select ::concat('ab', 'c');
Processus de développement
Les étapes diffèrent légèrement entre Java et Python.
Java
| Étape | Obligatoire | Description | Outil |
|---|---|---|---|
| 1 | Non | Ajoutez la dépendance SDK Maven à votre fichier POM. Recherchez odps-sdk-udf dans dépôts Maven pour obtenir la dernière version. Extrait d'exemple : <dependency><groupId>com.aliyun.odps</groupId><artifactId>odps-sdk-udf</artifactId><version>0.29.10-public</version></dependency> |
IntelliJ IDEA (Maven) |
| 2 | Oui | Écrivez le code de la UDTF. | IntelliJ IDEA (Maven) ou MaxCompute Studio |
| 3 | Oui | Déboguez la UDTF sur votre machine locale ou via des tests unitaires. | — |
| 4 | Oui | Empaquetez la UDTF dans un fichier JAR. | — |
| 5 | Oui | Téléchargez le fichier JAR en tant que ressource dans votre projet MaxCompute. | Client MaxCompute, MaxCompute Studio ou DataWorks |
| 6 | Oui | Enregistrez la UDTF à l'aide du fichier JAR téléchargé. | — |
| 7 | Non | Appelez la UDTF dans une requête SQL. | — |
Pour l'étape 2, consultez Développer une UDF en Java. Pour l'étape 5, consultez Ajouter des ressources et Créer une fonction. Pour empaqueter et enregistrer en un seul flux à l'aide de MaxCompute Studio, consultez Empaqueter un programme Java, télécharger le package et créer une UDF MaxCompute.

Python
| Étape | Obligatoire | Description | Outil |
|---|---|---|---|
| 1 | Oui | Écrivez le code de la UDTF. | MaxCompute Studio |
| 2 | Oui | Déboguez la UDTF sur votre machine locale ou via des tests unitaires. | — |
| 3 | Oui | Téléchargez les fichiers Python ou les ressources requises (ressources de fichier, ressources de table, packages tiers) dans votre projet MaxCompute. | Client MaxCompute, MaxCompute Studio ou DataWorks |
| 4 | Oui | Enregistrez la UDTF en vous basant sur les fichiers téléchargés. | — |
| 5 | Non | Appelez la UDTF dans une requête SQL. | — |
Pour l'étape 1, consultez Développer une UDF Python. Pour l'étape 3, consultez Ajouter des ressources et Créer une fonction. Pour télécharger et enregistrer en un seul flux à l'aide de MaxCompute Studio, consultez Télécharger un programme Python et créer une UDF MaxCompute.

Appeler une UDTF
Au sein du même projet : appelez une UDTF de la même manière que vous appelez une fonction native.
Entre projets : pour appeler une UDTF du projet B depuis le projet A, utilisez la syntaxe suivante :
select B:udf_in_other_project(arg0, arg1) as res from table_t;
Pour plus d'informations sur le partage de ressources entre projets, consultez Partage de ressources basé sur les packages entre projets.