Tous les produits
Search
Centre de documentation

MaxCompute:Fonction table définie par l'utilisateur (UDTF) en Python 3

Dernière mise à jour :Aug 10, 2026

MaxCompute prend en charge Python 3 via CPython 3.7.3. Python 2 ayant atteint sa fin de vie (EOL), rédigez toutes les nouvelles fonctions tables définies par l'utilisateur (UDTF) en Python 3.

Activer Python 3

Par défaut, les projets MaxCompute utilisent Python 2 pour les UDF. Pour utiliser Python 3, ajoutez la commande suivante au niveau de la session avant votre instruction SQL et soumettez l'ensemble :

set odps.sql.python.version=cp37;

Structure du code UDTF

Utilisez MaxCompute Studio pour écrire le code UDTF en Python 3. Une UDTF se compose de quatre éléments :

Composant Obligatoire Description
Imports de module Obligatoire Doit inclure from odps.udf import annotate et from odps.udf import BaseUDTF. Pour référencer des fichiers ou des tables, ajoutez également from odps.distcache import get_cache_file ou from odps.distcache import get_cache_table.
Signature de fonction Facultatif Déclarée avec @annotate(<signature>). Définit les types de données des paramètres d'entrée et des valeurs de retour. Sans signature, tout type de donnée d'entrée est accepté et toutes les valeurs de retour sont par défaut de type STRING.
Classe Python personnalisée Obligatoire Une classe dérivée de BaseUDTF. Définit les variables et les méthodes de votre logique métier.
Méthodes de classe Obligatoire Implémentez les méthodes requises décrites dans le tableau ci-dessous.

Méthodes de classe

Méthode Obligatoire Moment de l'appel Description
BaseUDTF.init() Facultatif Une fois, avant le premier enregistrement Méthode d'initialisation. Lors de la substitution, appelez super(BaseUDTF, self).init() au début. Utilisez cette méthode pour configurer l'état interne qui persiste entre les enregistrements.
BaseUDTF.process([args, ...]) Obligatoire Une fois par enregistrement SQL Traite chaque ligne d'entrée. Les paramètres de la fonction process correspondent aux paramètres d'entrée de l'UDTF spécifiés dans les instructions SQL.
BaseUDTF.forward([args, ...]) Obligatoire Appelée par votre code Génère une ligne par appel. Les paramètres de la méthode forward correspondent aux paramètres de sortie de l'UDTF spécifiés dans les instructions SQL. Sans signature de fonction, convertissez toutes les valeurs en STRING avant d'appeler forward.
BaseUDTF.close() Facultatif Une fois, avant le dernier enregistrement Méthode de nettoyage. Utilisez cette méthode pour libérer les ressources lors de la terminaison de l'UDTF.

L'exemple suivant présente une UDTF minimale qui divise une chaîne séparée par des virgules en lignes individuelles :

# Import the function signature module and the base class.
from odps.udf import annotate
from odps.udf import BaseUDTF

# Function signature: takes a STRING, returns a STRING.
@annotate('string -> string')

# Custom Python class derived from BaseUDTF.
class Explode(BaseUDTF):

    def process(self, arg):
        props = arg.split(',')
        for p in props:
            self.forward(p)
Les UDTF Python 2 et Python 3 s'exécutent sur des versions sous-jacentes de Python différentes. Rédigez chaque UDTF selon la syntaxe et les capacités de la version Python ciblée.

Limitations

Python 3 n'est pas compatible avec Python 2. Une instruction SQL unique ne peut pas mélanger des UDTF Python 2 et Python 3.

Migrer les UDTF Python 2

Python 2 a atteint sa fin de vie. Migrez vos UDTF Python 2 existantes en fonction de la situation de votre projet :

  • Nouveau projet ou première UDF Python : Rédigez toutes les UDF Python en Python 3 dès le départ.

  • Projet existant avec de nombreuses UDTF Python 2 : Migrez progressivement pour éviter toute perturbation. Choisissez l'une des approches suivantes :

    • Rédigez les nouvelles UDTF en Python 3 et activez Python 3 au niveau de la session pour les tâches utilisant ces nouvelles UDTF. Pour plus de détails, consultez la section Activer Python 3.

    • Réécrivez les UDTF Python 2 existantes pour qu'elles soient compatibles avec Python 2 et Python 3. Consultez le guide Porting Python 2 Code to Python 3 pour obtenir des indications.

Si une UDTF est partagée entre plusieurs projets MaxCompute, rendez-la compatible avec Python 2 et Python 3 afin d'éviter de perturber les projets qui utilisent encore Python 2.

Bibliothèques tierces

NumPy n'est pas inclus dans l'environnement d'exécution Python 3 de MaxCompute. Pour utiliser NumPy dans une UDTF, téléchargez manuellement un package wheel NumPy en tant que ressource. Le nom de fichier attendu depuis Python Package Index (PyPI) ou une image est :

numpy-<Version>-cp37-cp37m-manylinux1_x86_64.whl

Pour obtenir des instructions sur le téléchargement du package, consultez les sections Opérations sur les ressources ou Référencer des packages tiers dans les UDF Python.

Signatures de fonction et types de données

Une signature de fonction déclare les types de données des paramètres d'entrée et des valeurs de retour d'une UDTF. MaxCompute valide la signature lors de l'analyse sémantique et renvoie une erreur si les types réels ne correspondent pas.

Format de la signature

@annotate('arg_type_list -> type_list')
  • arg_type_list : types des paramètres d'entrée séparés par des virgules. Définissez la valeur sur * pour accepter n'importe quel nombre de paramètres, ou laissez vide pour n'accepter aucun paramètre.

  • type_list : types des valeurs de retour. Une UDTF peut renvoyer plusieurs colonnes.

Types pris en charge pour type_list : BIGINT, STRING, DOUBLE, BOOLEAN, DATETIME, DECIMAL, FLOAT, BINARY, DATE, DECIMAL(précision,échelle) et types complexes (ARRAY, MAP, STRUCT), y compris les types complexes imbriqués.

Types pris en charge pour arg_type_list : tous les types énumérés ci-dessus, plus CHAR et VARCHAR.

Sélectionnez les types de données en fonction de l'édition des types de données de votre projet MaxCompute.

Exemples de signatures

Signature Description
@annotate('bigint,boolean->string,datetime') Deux paramètres d'entrée (BIGINT, BOOLEAN) ; deux valeurs de retour (STRING, DATETIME).
@annotate('*->string,datetime') N'importe quel nombre de paramètres d'entrée ; deux valeurs de retour (STRING, DATETIME).
@annotate('->double,bigint,string') Aucun paramètre d'entrée ; trois valeurs de retour (DOUBLE, BIGINT, STRING).
@annotate("array<string>,struct<a1:bigint,b1:string>,string->map<string,bigint>,struct<b1:bigint>") Entrées et sorties de type complexe.

Correspondances des types de données

Rédigez les UDTF Python en utilisant les types Python qui correspondent aux types SQL MaxCompute :

Type SQL MaxCompute Type Python 3
BIGINT INT
STRING UNICODE
DOUBLE FLOAT
BOOLEAN BOOL
DATETIME DATETIME.DATETIME
FLOAT FLOAT
CHAR UNICODE
VARCHAR UNICODE
BINARY BYTES
DATE DATETIME.DATE
DECIMAL DECIMAL.DECIMAL
ARRAY LIST
MAP DICT
STRUCT COLLECTIONS.NAMEDTUPLE

Référencer des ressources

Référencez des fichiers et des tables dans une UDF Python à l'aide du module odps.distcache.

odps.distcache.get_cache_file(resource_name)

Renvoie le contenu d'une ressource de fichier.

  • resource_name : le nom d'une ressource de fichier existante dans votre projet MaxCompute. Renvoie une erreur si le nom est invalide ou si le fichier n'existe pas.

  • Renvoie un objet de type fichier. Appelez close() sur l'objet lorsque vous avez terminé pour libérer le descripteur de fichier.

  • Déclarez la ressource de fichier lors de la création de l'UDTF. Si vous omettez cette déclaration, l'appel de l'UDTF renvoie une erreur.

odps.distcache.get_cache_table(resource_name)

Renvoie le contenu d'une ressource de table.

  • resource_name : le nom d'une ressource de table existante dans votre projet MaxCompute. Renvoie une erreur si le nom est invalide ou si la table n'existe pas.

  • Renvoie un générateur. L'itération dessus produit un enregistrement par ligne, où chaque enregistrement est un ARRAY.

L'exemple suivant lit les données d'un fichier JSON et d'une ressource de table, puis génère des lignes basées sur une recherche :

from odps.udf import annotate
from odps.udf import BaseUDTF
from odps.distcache import get_cache_file
from odps.distcache import get_cache_table

@annotate('string -> string, bigint')
class UDTFExample(BaseUDTF):

    def __init__(self):
        import json
        # Load the JSON file resource into a dict.
        cache_file = get_cache_file('test_json.txt')
        self.my_dict = json.load(cache_file)
        cache_file.close()

        # Append records from the table resource into the dict.
        records = list(get_cache_table('table_resource1'))
        for record in records:
            self.my_dict[record[0]] = record[1]

    def process(self, pageid):
        # For each input pageid, forward all associated adid values.
        for adid in self.my_dict[pageid]:
            self.forward(pageid, adid)

Appeler une UDTF Python 3

Après avoir développé une UDTF Python 3 en suivant le processus de développement, appelez-la depuis MaxCompute SQL.

  • Au sein d'un projet : Appelez l'UDTF de la même manière qu'une fonction intégrée.

  • Entre projets : Référencez une UDTF d'un autre projet en utilisant le nom du projet comme préfixe :

    SELECT B:udf_in_other_project(arg0, arg1) AS res FROM table_t;

    Pour la configuration du partage de ressources entre projets, consultez la section Partage de ressources basé sur des packages entre projets.

Pour développer et tester une UDTF Python 3 dans MaxCompute Studio, consultez la section Développer une UDF Python.