Tous les produits
Search
Centre de documentation

MaxCompute:Exemple d'UDF : Utiliser des packages tiers dans les UDF Python

Dernière mise à jour :Aug 10, 2026

MaxCompute vous permet d'utiliser des packages tiers dans une fonction définie par l'utilisateur (UDF) Python, tels que le package NumPy, des packages nécessitant une compilation ou ceux qui dépendent d'une bibliothèque à liaison dynamique. Cette rubrique explique comment les utiliser.

Informations générales

Vous pouvez utiliser des packages tiers dans une UDF Python dans les scénarios suivants :

  • Utiliser le package NumPy (UDF Python 3)

    Modifiez l'extension du fichier du package NumPy, téléchargez le package à l'aide du client MaxCompute, puis enregistrez la fonction pour l'appeler depuis votre UDF Python 3.

  • Utiliser un package tiers nécessitant une compilation

    Dans un environnement compatible avec MaxCompute, compilez le script setup.py du package tiers pour générer un package wheel et modifiez l'extension du fichier. Ensuite, utilisez le client MaxCompute pour télécharger le package et enregistrer la fonction afin de l'appeler depuis votre UDF Python.

  • Utiliser un package tiers dépendant d'une bibliothèque à liaison dynamique

    Compilez un fichier de bibliothèque .so à partir du code source du package tiers, générez un package wheel, puis modifiez l'extension du fichier. Ensuite, utilisez le client MaxCompute pour télécharger le package et le fichier de bibliothèque .so, et enregistrez la fonction pour l'appeler depuis votre UDF Python.

Prérequis

Avant de commencer, assurez-vous que les conditions suivantes sont remplies :

  • Python est installé. Python 3 est recommandé.

  • Le client MaxCompute est installé et configuré. Pour plus d'informations, consultez la section Installer et configurer le client MaxCompute.

  • Pour les packages nécessitant une compilation, assurez-vous que pip, setuptools et wheel sont installés. Exécutez la commande pip install setuptools pour installer setuptools et la commande pip install wheel pour installer wheel.

  • Si vous utilisez GDAL 3.0 ou une version ultérieure, assurez-vous que PROJ 6 est installé.

  • Si vous utilisez Docker pour compiler un package tiers, assurez-vous que Docker est installé. Pour plus d'informations, consultez la documentation d'installation de Docker.

Utiliser le package NumPy (UDF Python 3)

L'environnement Python 2 de MaxCompute inclut NumPy par défaut. Pour utiliser le package NumPy dans une UDF Python 3, vous devez télécharger manuellement le package en suivant ces étapes :

  1. En prenant la version 1.19.2 comme exemple, accédez à la page PyPI. Dans la section Download files, téléchargez le package NumPy dont le nom de fichier se termine par cp37-cp37m-manylinux1_x86_64.whl.

    Remarque

    Le chargement peut échouer si vous utilisez un package avec une extension de fichier différente. Si vous souhaitez utiliser une version différente, accédez à la section Navigation dans le coin supérieur gauche de la page PyPI et cliquez sur Release history pour afficher les versions historiques.

  2. Modifiez l'extension du fichier du package NumPy téléchargé en .zip.

    Exemple : numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip.

  3. Utilisez le client MaxCompute pour télécharger le package NumPy vers un projet MaxCompute. Pour plus d'informations sur le téléchargement d'une ressource, consultez la section Opérations sur les ressources.

    Commande d'exemple :

    ADD ARCHIVE D:\Downloads\numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip -f;
  4. Écrivez un script UDF Python et enregistrez-le sous forme de fichier .py.

    Voici un exemple de script UDF Python enregistré sous le nom import_numpy.py :

    from odps.udf import annotate
    
    @annotate("->string")
    class TryImport(object): # The class name is TryImport.
        def __init__(self):
            import sys
            sys.path.insert(0, 'work/numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip') # The NumPy package. You only need to replace the package name that follows work/.
    
        def evaluate(self):
            import numpy
            return "import succeed"
  5. Utilisez le client MaxCompute pour télécharger le script import_numpy.py en tant que ressource vers votre projet MaxCompute.

    Commande d'exemple :

    ADD PY D:\Desktop\import_numpy.py -f;
  6. Utilisez le script import_numpy.py téléchargé et le package NumPy pour enregistrer une fonction définie par l'utilisateur via le client MaxCompute. Pour plus d'informations sur l'enregistrement d'une fonction, consultez la section Opérations sur les fonctions.

    Supposons que la fonction définie par l'utilisateur enregistrée soit nommée numpy et que la ressource de la fonction se trouve dans le projet test_project. Commande d'exemple :

    CREATE FUNCTION numpy AS 'import_numpy.TryImport' USING 'test_project/resources/import_numpy.py,numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip';
    Remarque

    Lorsque vous enregistrez la fonction, vous devez ajouter le package NumPy, tel que numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip, à la liste des ressources.

  7. Après avoir enregistré la fonction, appelez-la depuis vos instructions SQL. Assurez-vous d'activer Python 3 pour l'exécution. Pour plus d'informations, consultez la section Spécifications et flux de travail de développement des UDF Python 3.

Utiliser des packages nécessitant une compilation

Si un package tiers est une archive TAR.GZ provenant de PyPI ou un package de code source provenant de GitHub, le répertoire racine du package décompressé peut contenir un fichier setup.py. Avant de pouvoir utiliser ce type de package, vous devez compiler le fichier setup.py pour générer un package wheel dans un environnement compatible avec MaxCompute. Ensuite, téléchargez la ressource et enregistrez la fonction. Vous pourrez alors appeler le package tiers à l'aide d'une UDF Python. Pour plus d'informations sur le téléchargement d'une ressource et l'enregistrement d'une fonction, consultez la section Utiliser le package NumPy (UDF Python 3).

Important
  • Les packages tiers s'exécutent dans un environnement Linux sur MaxCompute. Pour éviter les problèmes de compatibilité, compilez-les dans un environnement Linux plutôt que sur Windows.

  • Si vous utilisez un environnement Windows, nous vous recommandons d'utiliser la version correspondante de Python (/opt/python/cp27-cp27m/bin/python ou /opt/python/cp37-cp37m/bin/python3) pour construire un package wheel dans le conteneur quay.io/pypa/manylinux2010_x86_64 Docker.

Si vous utilisez un environnement Linux, vérifiez les points suivants pour assurer la compatibilité :

  • Vous devez utiliser une version de Python compatible. Dans l'interface de ligne de commande (CLI) de votre système, exécutez la commande suivante pour vérifier la compatibilité de votre version de Python :

    python -c "import wheel.pep425tags; print(wheel.pep425tags.get_abi_tag())"
    • Si cp27m ou cp37m est renvoyé, la version de Python répond aux exigences de compatibilité.

    • Si cp27mu ou cp37mu est renvoyé, la version de Python ne répond pas aux exigences de compatibilité. Vous devez exécuter la commande ./configure --enable-unicode=ucs2 dans la CLI pour définir l'encodage Python sur UCS-2.

  • S'il existe des dépendances sur du code C ou C++, vous devez utiliser une version compatible de GNU Compiler Collection (GCC).

    Remarque

    Nous vous recommandons d'utiliser GCC 4.9.2 ou une version antérieure. Si vous utilisez une version de GCC ultérieure à 4.9.2, les fichiers .so du package wheel généré peuvent être incompatibles avec l'environnement MaxCompute.

Une fois que votre environnement répond aux exigences de compatibilité, suivez ces étapes pour générer un package wheel à partir d'un fichier setup.py :

  1. Extrayez le package tiers dans un répertoire local. Dans la CLI de votre système, basculez vers le dossier où se trouve le fichier setup.py.

    Par exemple, si vous téléchargez le package GDAL-3.2.0.zip et l'extrayez, le fichier setup.py se trouve dans le répertoire D:\Downloads\GDAL-3.2.0. Commande d'exemple :

    cd D:\Downloads\GDAL-3.2.0
  2. Dans la CLI, exécutez la commande suivante pour vérifier si bdist_wheel figure dans la sortie.

    Commande d'exemple :

    python setup.py --help-command
  3. Dans la CLI, exécutez la commande suivante pour compiler et générer un package wheel.

    python setup.py bdist_wheel 
    Remarque

    Le package wheel se trouve dans le répertoire dist.

Utiliser des packages avec des bibliothèques à liaison dynamique

Certains packages Python tiers peuvent dépendre d'autres bibliothèques à liaison dynamique en plus des bibliothèques Python. Cette section utilise GDAL 3.0.4 comme exemple pour décrire comment utiliser le conteneur Docker quay.io/pypa/manylinux2010_x86_64 pour compiler les fichiers de bibliothèque .so pertinents et générer un package wheel utilisable dans MaxCompute. Vous utiliserez ensuite ces fichiers générés pour les télécharger en tant que ressources et enregistrer la fonction, ce qui vous permettra d'appeler le package depuis une UDF Python. Pour plus d'informations sur le téléchargement d'une ressource et l'enregistrement d'une fonction, consultez la section Utiliser le package NumPy (UDF Python 3).

Remarque

Assurez-vous que Docker est installé avant de continuer. Pour plus d'informations sur les opérations Docker, consultez la documentation Docker.

Pour utiliser un package tiers dépendant d'un fichier de bibliothèque .so dans une UDF Python, suivez ces étapes :

  1. Consultez les dépendances. Vous pouvez afficher les dépendances dans la section Dependencies de la page PyPI.

    Par exemple, les dépendances de GDAL 3.0.4 sont les suivantes.

    Dependencies
    
    - libgdal (3.0.4 or greater) and header files (gdal-devel)
    - numpy (1.0.0 or greater) and header files (numpy-devel) (not explicitly required, but many examples and utilities will not work without it)
    Remarque

    Comme indiqué ci-dessus, les dépendances incluent libgdal et numpy. libgdal est obtenu en compilant le code source GDAL dans un conteneur, et numpy est obtenu en téléchargeant le package NumPy depuis la page PyPI ou dans un conteneur Docker.

  2. Téléchargez le package NumPy.

    Vous pouvez télécharger le package NumPy en utilisant l'une des méthodes suivantes :

    • Sur la page PyPI, accédez à la section Download files et téléchargez le package NumPy dont le nom de fichier se termine par cp37-cp37m-manylinux1_x86_64.whl.

      Remarque

      Si vous utilisez un environnement Python 2, vous devez télécharger un package NumPy compatible. Dans la zone Navigation sur le côté gauche de la page PyPI, cliquez sur Release history, sélectionnez la version 1.16.6 ou une version antérieure, et téléchargez le package dont le nom de fichier se termine par cp27-cp27m-manylinux1_x86_64.whl.

    • Dans le conteneur Docker quay.io/pypa/manylinux2010_x86_64, exécutez la commande /opt/python/cp37-cp37m/bin/pip download numpy -d ./ pour télécharger le package NumPy dans le répertoire actuel.

  3. Compilez le fichier de bibliothèque .so.

    1. Téléchargez le code source GDAL 3.0.4 et extrayez-le dans un répertoire local.

    2. Utilisez Docker pour extraire l'image du conteneur quay.io/pypa/manylinux2010_x86_64 et entrer en mode terminal interactif.

      Commandes d'exemple :

      docker pull quay.io/pypa/manylinux2010_x86_64
      docker run -it quay.io/pypa/manylinux2010_x86_64 /bin/bash
    3. Copiez le code source GDAL 3.0.4 dans le conteneur.

      Commande d'exemple :

      docker cp ./gdal-3.0.4 <CONTAINER ID>:/opt/source/  

      Pour obtenir l'ID CONTENEUR, consultez la page docker ps.

  4. Compilez GDAL 3.0.4 dans le conteneur. Pour plus d'informations, consultez la page BuildingOnUnix.

    Commandes d'exemple :

    # You must specify the installation directory of PROJ 6 in the configure option.
    ./configure --prefix=/path/to/install/prefix --with-proj=/path/to/install/proj6/prefix
    make
    make install
    export PATH=/path/to/install/prefix/bin:$PATH
    export LD_LIBRARY_PATH=/path/to/install/prefix/lib:$LD_LIBRARY_PATH
    export GDAL_DATA=/path/to/install/prefix/share/gdal
    # Test
    gdalinfo --version

    Les erreurs suivantes peuvent se produire lors de la compilation :

    • configure: error: PROJ 6 symbols not found : GDAL 3.0 et les versions ultérieures dépendent de PROJ 6. Vous devez télécharger et installer PROJ 6.

    • fatal error: zlib.h: No such file or directory : Exécutez la commande yum install zlib-devel et recompilez.

  5. Utilisez la commande docker cp pour copier les fichiers libgdal.so et libproj.so du conteneur vers votre machine locale. Ils se trouvent dans le dossier lib de leurs répertoires d'installation respectifs. Assurez-vous de copier les fichiers réels, et non leurs liens symboliques.

  6. Créez un package wheel GDAL dans le conteneur. Pour plus d'informations, consultez la page BuildingOnUnix.

    Commandes d'exemple :

    # If NumPy is required, you must install NumPy first.
    /opt/python/cp37-cp37m/bin/pip install numpy
    # Switch to the directory of the GDAL source code.
    cd swig/python
    # A wheel package is generated in the dist directory. Example: GDAL-3.0.4-cp37-cp37m-linux_x86_64.whl
    /opt/python/cp37-cp37m/bin/python setup.py bdist_wheel
  7. En vous basant sur les fichiers de bibliothèque .so générés, le package wheel ou le package NumPy, téléchargez les ressources et enregistrez la fonction pour utiliser le package tiers dans une UDF Python. Pour plus d'informations sur le téléchargement des ressources et l'enregistrement d'une fonction, consultez la section Utiliser le package NumPy (UDF Python 3).

    Prenez note des points suivants :

    • Lorsque vous téléchargez des ressources, vous devez télécharger libgdal.so et libproj.so en tant que ressources FILE, et télécharger numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip et GDAL-3.0.4-cp37-cp37m-linux_x86_64.zip en tant que ressources ARCHIVE.

    • Lorsque vous enregistrez la fonction, vous devez ajouter libgdal.so, libproj.so, numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip et GDAL-3.0.4-cp37-cp37m-linux_x86_64.zip à la liste des ressources de la fonction.

    Voici un exemple de code pour l'UDF Python :

    Remarque

    Cet exemple utilise du code Python 3 et doit être exécuté dans un environnement Python 3. Si vous devez l'exécuter dans un environnement Python 2, tenez compte de l'utilisation du paramètre get_cache_file. Pour plus d'informations, consultez la section Référencer des ressources.

    # coding: utf-8
    from odps.udf import annotate
    from odps.distcache import get_cache_file
    
    def include_file(file_name):
        import os, sys
        so_file = get_cache_file(file_name, 'b')
        
        with open(so_file.name, 'rb') as fp:
            content=fp.read()
            so = open(file_name, "wb")
            so.write(content)
            so.flush()
            so.close()
    
    @annotate("->string")
    class TryImport(object):
        def __init__(self):
            import sys
            include_file('libgdal.so.26')
            include_file('libproj.so.15')
            sys.path.insert(0, 'work/GDAL-3.0.4-cp37-cp37m-linux_x86_64.zip') # The compiled GDAL package. You only need to replace the package name that follows work/.
            sys.path.insert(0, 'work/numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip') # The NumPy package. You only need to replace the package name that follows work/.
    
        def evaluate(self):
            from osgeo import gdal
            from osgeo import ogr
            from osgeo import osr
            from osgeo import gdal_array
            from osgeo import gdalconst
            return "import succeed"
    Remarque

    Si vous rencontrez une erreur d'exécution indiquant que libgdal.so.26 ou libproj.so.15 est introuvable, renommez les fichiers libgdal.so et libproj.so téléchargés en libgdal.so.26 et libproj.so.15 respectivement.