Tüm Ürünler
Search
Belge Merkezi

MaxCompute:UDF örneği: Python UDF'lerde üçüncü taraf paketlerini kullanma

Son Güncelleme:Oct 04, 2026

MaxCompute, NumPy paketi gibi derleme gerektiren veya dinamik bağlantı kütüphanesine bağımlı olan paketleri Python kullanıcı tanımlı işlevlerinde (UDF) kullanmanıza olanak tanır. Bu konu, bu paketlerin nasıl kullanılacağını gösterir.

Arka plan bilgileri

Python UDF'lerde üçüncü taraf paketlerini aşağıdaki senaryolarda kullanabilirsiniz:

  • NumPy paketini kullanma (Python 3 UDF'leri)

    NumPy paketinin dosya adı uzantısını değiştirmeniz, paketi MaxCompute istemcisini kullanarak yüklemeniz ve ardından işlevi kaydetmeniz gerekir. Daha sonra bu işlevi Python 3 UDF'inizden çağırabilirsiniz.

  • Derleme gerektiren bir üçüncü taraf paketini kullanma

    MaxCompute ile uyumlu bir ortamda, üçüncü taraf paketindeki setup.py betiğini derleyerek bir wheel paketi oluşturmanız ve paketin dosya adı uzantısını değiştirmeniz gerekir. Ardından, MaxCompute istemcisini kullanarak paketi yükleyin ve işlevi kaydedin. Daha sonra bu işlevi Python UDF'inizden çağırabilirsiniz.

  • Dinamik bağlantı kütüphanesine bağımlı olan bir üçüncü taraf paketini kullanma

    Üçüncü taraf paketinin kaynak kodundan bir .so kütüphane dosyası derlemeniz, bir wheel paketi oluşturmanız ve ardından paketin dosya adı uzantısını değiştirmeniz gerekir. Daha sonra, MaxCompute istemcisini kullanarak paketi ve .so kütüphane dosyasını yükleyin ve işlevi kaydedin. Daha sonra bu işlevi Python UDF'inizden çağırabilirsiniz.

Ön koşullar

Başlamadan önce aşağıdaki gereksinimlerin karşılandığından emin olun:

  • Python yüklüdür. Python 3 önerilir.

  • MaxCompute istemcisi yüklü ve yapılandırılmıştır. Daha fazla bilgi için bkz. MaxCompute istemcisini yükleme ve yapılandırma.

  • Derleme gerektiren paketler için pip, setuptools ve wheel'in yüklü olduğundan emin olun. setuptools'i yüklemek için pip install setuptools komutunu ve wheel'i yüklemek için pip install wheel komutunu çalıştırabilirsiniz.

  • GDAL 3.0 veya sonraki bir sürümünü kullanıyorsanız PROJ 6'nın yüklü olduğundan emin olun.

  • Bir üçüncü taraf paketini derlemek için Docker kullanıyorsanız Docker yüklü olmalıdır. Daha fazla bilgi için bkz. Docker kurulum belgeleri.

NumPy paketini kullanma (Python 3 UDF'leri)

MaxCompute'un Python 2 ortamında NumPy varsayılan olarak bulunur. NumPy paketini bir Python 3 UDF'de kullanmak için paketi aşağıdaki adımları izleyerek manuel olarak yüklemeniz gerekir:

  1. Örnek olarak 1.19.2 sürümünü ele alalım, PyPI sayfasına gidin. Download files bölümünde, dosya adı cp37-cp37m-manylinux1_x86_64.whl ile biten NumPy paketini indirin.

    Not

    Farklı bir dosya adı uzantısına sahip bir paket kullanırsanız yükleme başarısız olabilir. Farklı bir sürüm kullanmak istiyorsanız PyPI sayfasının sol üst köşesindeki Navigation bölümüne gidin ve geçmiş sürümleri görüntülemek için Release history seçeneğine tıklayın.

  2. İndirilen NumPy paketinin dosya adı uzantısını .zip olarak değiştirin.

    Örnek: numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip.

  3. NumPy paketini bir MaxCompute projesine yüklemek için MaxCompute istemcisini kullanın. Bir kaynağın nasıl yükleneceği hakkında daha fazla bilgi için bkz. Kaynak işlemleri.

    Örnek komut:

    ADD ARCHIVE D:\Downloads\numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip -f;
  4. Bir Python UDF betiği yazın ve bunu .py dosyası olarak kaydedin.

    Aşağıda, import_numpy.py olarak kaydedilen örnek bir Python UDF betiği verilmiştir:

    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. import_numpy.py betiğini MaxCompute projenize bir kaynak olarak yüklemek için MaxCompute istemcisini kullanın.

    Örnek komut:

    ADD PY D:\Desktop\import_numpy.py -f;
  6. Yüklenen import_numpy.py betiğini ve NumPy paketini kullanarak MaxCompute istemcisi aracılığıyla bir kullanıcı tanımlı işlevi kaydedin. Bir işlevin nasıl kaydedileceği hakkında daha fazla bilgi için bkz. İşlev işlemleri.

    Kaydedilen kullanıcı tanımlı işlevinin adının numpy olduğunu ve işlev kaynağının test_project projesinde bulunduğunu varsayalım. Örnek komut:

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

    İşlevi kaydederken numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip gibi NumPy paketini kaynak listesine eklemeniz gerekir.

  7. İşlevi kaydettikten sonra SQL deyimlerinizden çağırın. Çalıştırma için Python 3'ü etkinleştirdiğinizden emin olun. Daha fazla bilgi için bkz. Python 3 UDF geliştirme teknik özellikleri ve iş akışı.

Derleme gerektiren paketleri kullanma

Bir üçüncü taraf paket PyPI üzerinden alınan bir TAR.GZ arşivi veya GitHub'dan alınan bir kaynak kod paketi ise, açılan paketin kök dizininde bir setup.py dosyası bulunabilir. Bu tür bir paketi kullanabilmeniz için önce MaxCompute ile uyumlu bir ortamda setup.py dosyasını derleyerek bir wheel paketi oluşturmanız gerekir. Ardından kaynağı yükleyin ve işlevi kaydedin. Daha sonra üçüncü taraf paketi bir Python UDF kullanarak çağırabilirsiniz. Bir kaynağın nasıl yükleneceği ve işlevin nasıl kaydedileceği hakkında daha fazla bilgi için bkz. NumPy paketini kullanma (Python 3 UDF'leri).

Önemli
  • Üçüncü taraf paketler MaxCompute üzerinde bir Linux ortamında çalışır. Uyumluluk sorunlarını önlemek için bunları Windows yerine bir Linux ortamında derleyin.

  • Windows ortamı kullanıyorsanız quay.io/pypa/manylinux2010_x86_64 Docker kapsayıcısında bir wheel paketi oluşturmak için ilgili Python sürümünü (/opt/python/cp27-cp27m/bin/python veya /opt/python/cp37-cp37m/bin/python3) kullanmanızı öneririz.

Linux ortamı kullanıyorsanız uyumluluğu sağlamak için aşağıdaki noktaları kontrol edin:

  • Uyumlu bir Python sürümü kullanmalısınız. Sisteminizin komut satırı arabiriminde (CLI) Python sürümünüzün uyumluluğunu kontrol etmek için aşağıdaki komutu çalıştırın:

    python -c "import wheel.pep425tags; print(wheel.pep425tags.get_abi_tag())"
    • cp27m veya cp37m döndürülürse Python sürümü uyumluluk gereksinimlerini karşılar.

    • cp27mu veya cp37mu döndürülürse Python sürümü uyumluluk gereksinimlerini karşılamaz. Python kodlamasını UCS-2 olarak ayarlamak için CLI'da ./configure --enable-unicode=ucs2 komutunu çalıştırmanız gerekir.

  • C veya C++ koduna bağımlılıklar varsa uyumlu bir GNU Compiler Collection (GCC) sürümü kullanmalısınız.

    Not

    GCC 4.9.2 veya önceki bir sürümü kullanmanızı öneririz. 4.9.2'den sonraki bir GCC sürümü kullanırsanız oluşturulan wheel paketindeki .so dosyaları MaxCompute ortamıyla uyumsuz olabilir.

Ortamınız uyumluluk gereksinimlerini karşıladığında, setup.py dosyasından bir wheel paketi oluşturmak için şu adımları izleyin:

  1. Üçüncü taraf paketi yerel bir dizine çıkarın. Sisteminizin CLI'sında setup.py dosyasının bulunduğu klasöre geçin.

    Örneğin, GDAL-3.2.0.zip paketini indirip çıkardıysanız setup.py dosyası D:\Downloads\GDAL-3.2.0 dizinindedir. Örnek komut:

    cd D:\Downloads\GDAL-3.2.0
  2. CLI'da çıktı içinde bdist_wheel olup olmadığını kontrol etmek için aşağıdaki komutu çalıştırın.

    Örnek komut:

    python setup.py --help-command
    • Çıktıda bdist_wheel varsa 3. Adım kısmına geçin.

    • Çıktıda bdist_wheel yoksa setup.py betiğini değiştirmeniz gerekir. from distutils.core import setup ifadesini from setuptools import setup olarak değiştirin. Ardından 3. Adım kısmına geçin.

  3. CLI'da bir wheel paketi derlemek ve oluşturmak için aşağıdaki komutu çalıştırın.

    python setup.py bdist_wheel 
    Not

    Wheel paketi dist dizinindedir.

Dinamik bağlantı kütüphaneleri içeren paketleri kullanma

Bazı üçüncü taraf Python paketleri, Python kütüphanelerine ek olarak diğer dinamik bağlantı kütüphanelerine de bağımlı olabilir. Bu bölümde, ilgili .so kütüphane dosyalarını derlemek ve MaxCompute'ta kullanılabilecek bir wheel paketi oluşturmak için quay.io/pypa/manylinux2010_x86_64 Docker kapsayıcısının nasıl kullanılacağı GDAL 3.0.4 örneği üzerinden açıklanmaktadır. Daha sonra bu oluşturulan dosyaları kaynak olarak yükleyecek ve işlevi kaydedeceksiniz; bu sayede paketi bir Python UDF'den çağırabilirsiniz. Bir kaynağın nasıl yükleneceği ve işlevin nasıl kaydedileceği hakkında daha fazla bilgi için bkz. NumPy paketini kullanma (Python 3 UDF'leri).

Not

Devam etmeden önce Docker'ın yüklü olduğundan emin olun. Docker işlemleri hakkında daha fazla bilgi için bkz. Docker belgeleri.

Bir Python UDF'de .so kütüphane dosyasına bağımlı olan bir üçüncü taraf paketi kullanmak için şu adımları izleyin:

  1. Bağımlılıkları görüntüleyin. Bağımlılıkları PyPI sayfasının Dependencies bölümünde görüntüleyebilirsiniz.

    Örneğin, GDAL 3.0.4'ün bağımlılıkları aşağıdaki gibidir.

    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)
    Not

    Yukarıda gösterildiği gibi bağımlılıklar arasında libgdal ve numpy bulunmaktadır. libgdal bir kapsayıcıda GDAL kaynak kodu derlenerek elde edilir ve numpy ise NumPy paketinin PyPI sayfasından veya bir Docker kapsayıcısından indirilmesiyle elde edilir.

  2. NumPy paketini indirin.

    NumPy paketini aşağıdaki yöntemlerden birini kullanarak indirebilirsiniz:

    • PyPI sayfasında Download files bölümüne gidin ve dosya adı cp37-cp37m-manylinux1_x86_64.whl ile biten NumPy paketini indirin.

      Not

      Python 2 ortamı kullanıyorsanız uyumlu bir NumPy paketi indirmelisiniz. PyPI sayfasının sol tarafındaki Navigation alanında Release history seçeneğine tıklayın, 1.16.6 veya önceki bir sürümü seçin ve dosya adı cp27-cp27m-manylinux1_x86_64.whl ile biten paketi indirin.

    • quay.io/pypa/manylinux2010_x86_64 Docker kapsayıcısında NumPy paketini geçerli dizine indirmek için /opt/python/cp37-cp37m/bin/pip download numpy -d ./ komutunu çalıştırın.

  3. .so kütüphane dosyasını derleyin.

    1. GDAL 3.0.4 kaynak kodunu indirin ve yerel bir dizine çıkarın.

    2. quay.io/pypa/manylinux2010_x86_64 kapsayıcı görüntüsünü çekmek ve etkileşimli terminal moduna girmek için Docker'ı kullanın.

      Örnek komutlar:

      docker pull quay.io/pypa/manylinux2010_x86_64
      docker run -it quay.io/pypa/manylinux2010_x86_64 /bin/bash
    3. GDAL 3.0.4 kaynak kodunu kapsayıcıya kopyalayın.

      Örnek komut:

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

      CONTAINER ID değerini almak için bkz. docker ps.

  4. Kapsayıcı içinde GDAL 3.0.4'ü derleyin. Daha fazla bilgi için bkz. BuildingOnUnix.

    Örnek komutlar:

    # 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

    Derleme sırasında aşağıdaki hatalar oluşabilir:

    • configure: error: PROJ 6 symbols not found: GDAL 3.0 ve sonraki sürümler PROJ 6'ya bağımlıdır. PROJ 6'yı indirmeniz ve yüklemeniz gerekir.

    • fatal error: zlib.h: No such file or directory: yum install zlib-devel komutunu çalıştırın ve tekrar derleyin.

  5. docker cp komutunu kullanarak libgdal.so ve libproj.so dosyalarını kapsayıcıdan yerel makinenize kopyalayın. Bu dosyalar kendi kurulum dizinlerinin lib klasöründe bulunur. Sembolik bağlantıları değil, gerçek dosyaları kopyaladığınızdan emin olun.

  6. Kapsayıcı içinde bir GDAL wheel paketi oluşturun. Daha fazla bilgi için bkz. BuildingOnUnix.

    Örnek komutlar:

    # 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. Oluşturulan .so kütüphane dosyalarına, wheel paketlerine veya NumPy paketlerine dayanarak kaynakları yükleyin ve üçüncü taraf paketi bir Python UDF'de kullanmak üzere işlevi kaydedin. Kaynakların nasıl yükleneceği ve işlevin nasıl kaydedileceği hakkında daha fazla bilgi için bkz. NumPy paketini kullanma (Python 3 UDF'leri).

    Aşağıdaki noktalara dikkat edin:

    • Kaynakları yüklerken libgdal.so ve libproj.so dosyalarını FILE kaynağı olarak, numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip ve GDAL-3.0.4-cp37-cp37m-linux_x86_64.zip dosyalarını ise ARCHIVE kaynağı olarak yüklemelisiniz.

    • İşlevi kaydederken libgdal.so, libproj.so, numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip ve GDAL-3.0.4-cp37-cp37m-linux_x86_64.zip dosyalarını işlevin kaynak listesine eklemelisiniz.

    Aşağıda Python UDF için örnek kod verilmiştir:

    Not

    Bu örnek Python 3 kodunu kullanır ve bir Python 3 ortamında çalıştırılmalıdır. Bir Python 2 ortamında çalıştırmanız gerekiyorsa get_cache_file parametresinin kullanımına dikkat edin. Daha fazla bilgi için bkz. Kaynaklara referans verme.

    # 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"
    Not

    libgdal.so.26 veya libproj.so.15 bulunamadığına dair bir çalışma zamanı hatasıyla karşılaşırsanız yüklenen libgdal.so ve libproj.so dosyalarının adlarını sırasıyla libgdal.so.26 ve libproj.so.15 olarak yeniden adlandırın.