Tous les produits
Search
Centre de documentation

MaxCompute:Développement d'UDF (Python 3)

Dernière mise à jour :Sep 17, 2026

MaxCompute prend en charge le développement de fonctions définies par l'utilisateur (UDF) en Python 3 pour implémenter une logique métier personnalisée.

Structure du code UDF

Utilisez MaxCompute Studio pour écrire une UDF en Python 3. Le code doit contenir les composants suivants :

  • Importation de module : obligatoire.

    Le code UDF doit inclure from odps.udf import annotate pour importer la signature de fonction. Cela permet à MaxCompute d'identifier la signature de fonction définie dans le code. Si vous souhaitez référencer des fichiers ou des tables dans le code UDF, celui-ci doit inclure from odps.distcache import get_cache_file ou from odps.distcache import get_cache_table.

  • Signature de fonction : obligatoire.

    Le format est @annotate(<signature>), où signature définit les types de données des paramètres d'entrée et de la valeur de retour de la fonction. Pour plus d'informations sur les signatures de fonction, consultez la section Signatures de fonction et types de données.

  • Classe Python personnalisée : obligatoire.

    La classe organise votre code UDF et définit les variables et méthodes qui implémentent votre logique métier. Vous pouvez également y référencer une bibliothèque tierce intégrée ou des ressources de fichier et de table. Pour plus d'informations, consultez les sections Bibliothèque tierce ou Référencement de ressources.

  • Méthode evaluate : obligatoire.

    La méthode evaluate est contenue dans la classe Python personnalisée. Elle définit les paramètres d'entrée et la valeur de retour de l'UDF. Chaque classe Python ne peut contenir qu'une seule méthode evaluate.

L'exemple de code suivant illustre une UDF.

# Import the function signature module.
from odps.udf import annotate
# Define the function signature.
@annotate("bigint,bigint->bigint")
# Define the custom Python class.
class MyPlus(object):
# Implement the evaluate method.
    def evaluate(self, arg0, arg1):
        if None in (arg0, arg1):
            return None
        return arg0 + arg1

Limites

  • Accès à Internet via les UDF

    Par défaut, MaxCompute n'autorise pas l'accès à Internet via les UDF. Si vous souhaitez accéder à Internet via des UDF, remplissez le formulaire de demande de connexion réseau en fonction de vos besoins métier et soumettez la demande. L'équipe d'assistance technique MaxCompute vous contactera rapidement pour activer la connectivité réseau. Pour plus d'informations sur le remplissage du formulaire de demande de connexion réseau, consultez la rubrique Processus de connexion réseau.

  • Accès à un VPC via les UDF

    Par défaut, MaxCompute n'autorise pas l'accès aux ressources des VPC via les UDF. Pour utiliser des UDF afin d'accéder aux ressources d'un VPC, vous devez établir une connexion réseau entre MaxCompute et le VPC. Pour plus d'informations sur les opérations associées, consultez la rubrique Accéder aux ressources VPC depuis une UDF.

  • Lecture des données de table via des UDF, UDAF ou UDTF

    Vous ne pouvez pas utiliser d'UDF, d'UDAF ou d'UDTF pour lire les données des types de tables suivants :

    • Table sur laquelle une évolution de schéma est effectuée

    • Table contenant des types de données complexes

    • Table contenant des types de données JSON

    • Table transactionnelle

Remarques d'utilisation

Python 3 n'est pas compatible avec Python 2 et les deux versions ne peuvent pas être utilisées dans la même instruction SQL. Tenez compte de la compatibilité avant d'effectuer la migration.

Remarque

Python 2 a atteint sa fin de vie (EOL) au début de l'année 2020. Nous vous recommandons de migrer vos projets en fonction de leur type.

Développement d'UDF : flux de travail général

Le développement d'UDF implique la préparation de l'environnement, l'écriture du code, le chargement et l'enregistrement de l'UDF, puis son appel. Les sections suivantes détaillent ce flux de travail à l'aide de MaxCompute Studio, DataWorks et odpscmd.

MaxCompute Studio

  1. Prérequis

    Installez MaxCompute Studio et connectez-le à un projet MaxCompute avant de commencer. Pour plus d'informations, consultez les rubriques suivantes :

    1. Installer MaxCompute Studio

    2. Créer une connexion à un projet MaxCompute

    3. Configurer un environnement de développement Python

  2. Écrivez le code UDF.

    1. Dans le panneau Project, sous le répertoire MaxCompute Studio, cliquez avec le bouton droit sur scripts et sélectionnez New > MaxCompute Python.

    2. Dans la boîte de dialogue Create new MaxCompute python class, saisissez un nom de classe pour Name, sélectionnez Python UDF comme type, puis cliquez sur OK.

    3. Écrivez le code UDF dans l'éditeur.

      from odps.udf import annotate
      
      @annotate("string,bigint->string")
      class GetUrlChar(object):
      
          def evaluate(self, url, n):
              if n == 0:
                  return ""
              try:
                  index = url.find(".htm")
                  if index < 0:
                      return ""
                  a = url[:index]
                  index = a.rfind("/")
                  b = a[index + 1:]
                  c = b.split("-")
                  if len(c) < n:
                      return ""
                  return c[-n]
              except Exception:
                  return "Internal error"
                  
      Remarque

      Pour savoir comment déboguer les UDF Python localement, consultez la rubrique Tester une UDF.

  3. Chargez et enregistrez l'UDF.

    Cliquez avec le bouton droit sur le programme Python cible et sélectionnez Deploy to server…. Configurez le nom de la fonction et cliquez sur OK. Pour plus d'informations, consultez la rubrique Charger un fichier et enregistrer une fonction.

    Dans cet exemple, le nom de la fonction est défini sur UDF_GET_URL_CHAR.

  4. Appelez l'UDF.

    Dans le volet de navigation de gauche, cliquez sur Project Explore. Cliquez avec le bouton droit sur le projet MaxCompute cible, sélectionnez Open Console, puis saisissez et exécutez l'instruction SQL pour appeler l'UDF.

    SET odps.sql.python.version=cp37; -- This command is required to enable Python 3 for the UDF.
    SELECT UDF_GET_URL_CHAR("http://www.taobao.com/a.htm", 1);

    Le résultat suivant est renvoyé :

    +-----+
    | _c0 |
    +-----+
    |  a  |
    +-----+

DataWorks

  1. Prérequis

    Activez DataWorks et associez-le à un projet MaxCompute avant de commencer. Pour plus d'informations, consultez la rubrique Se connecter à MaxCompute via DataWorks.

  2. Écrivez le code UDF.

    Vous pouvez développer le code UDF dans n'importe quel outil de développement Python et l'empaqueter. Le code suivant sert d'exemple.

    from odps.udf import annotate
    
    @annotate("string,bigint->string")
    class GetUrlChar(object):
    
        def evaluate(self, url, n):
            if n == 0:
                return ""
            try:
                index = url.find(".htm")
                if index < 0:
                    return ""
                a = url[:index]
                index = a.rfind("/")
                b = a[index + 1:]
                c = b.split("-")
                if len(c) < n:
                    return ""
                return c[-n]
            except Exception:
                return "Internal error"
                
  3. Chargez et enregistrez l'UDF.

    Chargez le code empaqueté et enregistrez l'UDF dans DataWorks. Pour plus d'informations, consultez les rubriques suivantes :

    1. Créer et utiliser des ressources MaxCompute

    2. Créer et utiliser une fonction définie par l'utilisateur

  4. Appelez l'UDF.

    Après avoir enregistré l'UDF, créez un nœud ODPS SQL pour écrire et exécuter des instructions SQL qui appellent l'UDF. Pour plus d'informations sur les nœuds ODPS SQL, consultez la rubrique Développer une tâche ODPS SQL. Le code suivant fournit un exemple d'instruction SQL.

    SET odps.sql.python.version=cp37; -- This command is required to enable Python 3 for the UDF.
    SELECT UDF_GET_URL_CHAR("http://www.taobao.com/a.htm", 1);

odpscmd

  1. Prérequis

    Téléchargez et installez odpscmd, puis configurez le fichier config pour vous connecter à un projet MaxCompute. Pour plus d'informations, consultez la rubrique Se connecter via le client MaxCompute (odpscmd).

  2. Écrivez le code UDF.

    Vous pouvez développer le code UDF dans n'importe quel outil de développement Python et l'empaqueter. Le code suivant sert d'exemple.

    from odps.udf import annotate
    
    @annotate("string,bigint->string")
    class GetUrlChar(object):
    
        def evaluate(self, url, n):
            if n == 0:
                return ""
            try:
                index = url.find(".htm")
                if index < 0:
                    return ""
                a = url[:index]
                index = a.rfind("/")
                b = a[index + 1:]
                c = b.split("-")
                if len(c) < n:
                    return ""
                return c[-n]
            except Exception:
                return "Internal error"
                
  3. Chargez et enregistrez l'UDF.

    Chargez le code empaqueté et enregistrez l'UDF à l'aide d'odpscmd. Pour plus d'informations, consultez les rubriques suivantes :

    1. ADD PY

    2. CREATE FUNCTION

  4. Appelez l'UDF.

    Après avoir enregistré l'UDF, écrivez et exécutez une instruction SQL pour l'appeler.

    SET odps.sql.python.version=cp37; -- This command is required to enable Python 3 for the UDF.
    SELECT UDF_GET_URL_CHAR("http://www.taobao.com/a.htm", 1);

Installer la bibliothèque NumPy

L'environnement d'exécution Python 3 intégré n'inclut pas NumPy. Si votre UDF nécessite NumPy, chargez manuellement le package WHEEL. Lorsque vous téléchargez le package depuis PyPI ou un site miroir, le nom du fichier suit le format numpy-<version>-cp37-cp37m-manylinux1_x86_64.whl. Pour plus d'informations sur le chargement d'un package, consultez les rubriques Opérations sur les ressources ou Utiliser un package tiers dans une UDF Python.

Pour obtenir la liste des bibliothèques standard prises en charge par Python 3, consultez la page Bibliothèque standard Python 3.

Signatures de fonction et types de données

Format des signatures de fonction :

@annotate(<signature>)

Le paramètre signature est une chaîne qui spécifie les types de données des paramètres d'entrée et de la valeur de retour. Lors de l'exécution d'une UDF, les types de données des paramètres d'entrée et de la valeur de retour de l'UDF doivent correspondre aux types de données spécifiés dans la signature de fonction. La cohérence des types de données est vérifiée lors de l'analyse sémantique. Si les types de données sont incohérents, une erreur est renvoyée. Format d'une signature :

'arg_type_list -> type'

Description des paramètres :

  • arg_type_list : spécifie les types de données des paramètres d'entrée. Si plusieurs paramètres d'entrée sont utilisés, leurs types de données sont séparés par des virgules (,). Les types de données suivants sont pris en charge : BIGINT, STRING, DOUBLE, BOOLEAN, DATETIME, DECIMAL, FLOAT, BINARY, DATE, DECIMAL(precision,scale), CHAR et VARCHAR. Les types de données complexes, tels que ARRAY, MAP et STRUCT, ainsi que les types de données complexes imbriqués, sont également pris en charge.

    arg_type_list peut être représenté par un astérisque (*) ou laissé vide ('').

    • Si arg_type_list est représenté par un astérisque (*), un nombre variable de paramètres d'entrée est autorisé.

    • Si arg_type_list est laissé vide (''), aucun paramètre d'entrée n'est utilisé.

  • type : spécifie le type de données de la valeur de retour. Pour une UDF, une seule colonne de valeurs est renvoyée. Les types de données suivants sont pris en charge : BIGINT, STRING, DOUBLE, BOOLEAN, DATETIME, DECIMAL, FLOAT, BINARY, DATE et DECIMAL(precision,scale). Les types de données complexes, tels que ARRAY, MAP et STRUCT, ainsi que les types de données complexes imbriqués, sont également pris en charge.

Remarque

Lors de l'écriture du code UDF, vous pouvez sélectionner un type de données en fonction de l'édition de type de données MaxCompute utilisée par votre projet MaxCompute. Pour plus d'informations sur les éditions de types de données MaxCompute et les types de données pris en charge dans chaque édition, consultez la rubrique Éditions de types de données.

Le tableau suivant fournit des exemples de signatures de fonction valides.

Signature de fonction

Description

'bigint,double->string'

Les types de données des paramètres d'entrée sont BIGINT et DOUBLE et le type de données de la valeur de retour est STRING.

'*->string'

Un nombre variable de paramètres d'entrée est utilisé et le type de données de la valeur de retour est STRING.

'->double'

Aucun paramètre d'entrée n'est utilisé et le type de données de la valeur de retour est DOUBLE.

'array<bigint>->struct<x:string, y:int>'

Le type de données des paramètres d'entrée est ARRAY<BIGINT> et le type de données de la valeur de retour est STRUCT<x:STRING, y:INT>.

'->map<bigint, string>'

Aucun paramètre d'entrée n'est utilisé et le type de données de la valeur de retour est MAP<BIGINT, STRING>.

Le tableau suivant décrit les correspondances entre les types de données pris en charge dans MaxCompute SQL et les types de données Python 2. Vous devez écrire les UDF Python en vous basant sur ces correspondances pour garantir la cohérence des types de données.

Type MaxCompute SQL

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érencement de ressources

Vous pouvez référencer des fichiers ou des tables dans le code UDF Python 2 à l'aide du module odps.distcache .

  • odps.distcache.get_cache_file(resource_name, mode) : Renvoie le contenu d'une ressource de fichier spécifiée dans le mode indiqué.

    • resource_name est une chaîne qui spécifie le nom d'une table existante dans votre projet MaxCompute. Si le nom de la table n'est pas valide ou si la table n'existe pas, une erreur est renvoyée.

    • Le paramètre mode est une chaîne STRING. La valeur par défaut est 't'. Si vous définissez mode sur 't', le fichier est ouvert en mode texte. Si vous définissez mode sur 'b', le fichier est ouvert en mode binaire.

    • La valeur de retour est un objet de type fichier. Si cet objet n'est plus utilisé, vous devez appeler la méthode close pour libérer le fichier ouvert.

    Le code suivant montre comment référencer un fichier.

    from odps.udf import annotate
    from odps.distcache import get_cache_file
    @annotate('bigint->string')
    class DistCacheExample(object):
    def __init__(self):
        cache_file = get_cache_file('test_distcache.txt')
        kv = {}
        for line in cache_file:
            line = line.strip()
            if not line:
                continue
            k, v = line.split()
            kv[int(k)] = v
        cache_file.close()
        self.kv = kv
    def evaluate(self, arg):
        return self.kv.get(arg)
  • odps.distcache.get_cache_table(resource_name) : Renvoie le contenu d'une ressource de table spécifiée.

    • Le paramètre resource_name spécifie une ressource de table existante dans le projet MaxCompute actuel. Une exception est levée si le nom de la ressource n'est pas valide ou si la ressource n'existe pas. Types de données pris en charge : BIGINT, STRING, DOUBLE, BOOLEAN, DATETIME, FLOAT, CHAR, VARCHAR, BINARY, DATE, DECIMAL, ARRAY, MAP et STRUCT.

    • La valeur de retour est un générateur. Chaque itération produit un enregistrement de table sous forme de tableau.

Le code suivant montre comment référencer une table.

from odps.udf import annotate
from odps.distcache import get_cache_table
@annotate('->string')
class DistCacheTableExample(object):
    def __init__(self):
        self.records = list(get_cache_table('udf_test'))
        self.counter = 0
        self.ln = len(self.records)
    def evaluate(self):
        if self.counter > self.ln - 1:
            return None
        ret = self.records[self.counter]
        self.counter += 1
        return str(ret)

Appel d'UDF

Après avoir développé une UDF Python 3 en suivant le flux de travail de développement, vous pouvez l'appeler dans MaxCompute SQL comme suit :

Activer Python 3

Par défaut, MaxCompute utilise Python 2. Pour utiliser Python 3, incluez l'indicateur de session suivant dans votre instruction SQL.

set odps.sql.python.version=cp37;

Appeler la fonction

  • Utiliser une UDF dans un projet MaxCompute : la méthode est similaire à celle d'utilisation des fonctions intégrées. Vous pouvez utiliser une fonction définie par l'utilisateur de la même manière qu'une fonction intégrée.

  • Utiliser une UDF entre projets : utilisez une UDF du projet B dans le projet A. L'instruction suivante en est un exemple : select B:udf_in_other_project(arg0, arg1) as res from table_t;. Pour plus d'informations sur le partage interprojets, consultez la rubrique Accès aux ressources interprojets basé sur les packages.

Migrer les UDF Python 2

Python 2 a atteint sa fin de vie au début de l'année 2020. Nous vous recommandons de migrer vos projets en fonction de leur type :

  • Nouveaux projets : pour les nouveaux projets MaxCompute ou les projets pour lesquels vous écrivez des UDF Python pour la première fois, utilisez Python 3 pour toutes les UDF Python.

  • Projets existants : pour les projets comportant de nombreuses UDF Python 2, faites preuve de prudence lors de l'activation de Python 3. Pour effectuer une migration progressive, utilisez les méthodes suivantes :

    • Nouvelles tâches et nouvelles UDF : utilisez Python 3 pour écrire des UDF et activez Python 3 au niveau de la session. Pour plus d'informations sur l'activation de Python 3, consultez la section Activer Python 3.

    • UDF Python 2 : réécrivez les UDF Python 2 pour les rendre compatibles avec Python 2 et Python 3. Pour plus d'informations sur la réécriture des UDF, consultez la page Portage du code Python 2 vers Python 3.

      Remarque

      Si vous écrivez des UDF publiques partagées entre plusieurs projets MaxCompute, assurez-vous qu'elles sont compatibles avec Python 2 et Python 3.

Exemples d'UDF