Tüm Ürünler
Search
Belge Merkezi

MaxCompute:PyODPS düğümünde üçüncü taraf pakete başvurma

Son Güncelleme:Oct 04, 2026

SciPy veya python-dateutil gibi üçüncü taraf Python paketlerini MaxCompute kaynağı olarak yükleyip kodunuzda başvuruda bulunarak PyODPS içinde kullanabilirsiniz. pyodps-pack ile paket oluşturma yönergeleri için bkz. PyODPS için üçüncü taraf paket oluşturma.

Ön koşullar

Başlamadan önce aşağıdakileri yaptığınızdan emin olun:

Yöntem seçin

Senaryonuza uygun yöntemi seçin:


Senaryo


Önerilen yöntem


Yeni proje, Python UDF veya DataFrame


Paketlemek ve yüklemek için pyodps-pack kullanın; ardından sys.path veya libraries parametresi üzerinden başvurun


Dahili paketlere sahip DataWorks PyODPS düğümü


DataWorks dahili yöntemini veya load_resource_package öğesini kullanın


Elle yüklenmiş WHL dosyaları içeren mevcut proje


Elle yükleme (yalnızca eski bakım için; yeni projeler için pyodps-pack kullanın)

Üçüncü taraf paket yükleme

Üçüncü taraf pakete başvurmadan önce bunu arşiv kaynağı olarak MaxCompute'a yükleyin. Aşağıdaki yöntemlerden birini kullanın:

  • Kodla yükleme. packages.tar.gz ifadesini paket dosyanızın yolu ve adıyla değiştirin.

    import os
    from odps import ODPS
    
    # Load credentials from environment variables.
    # Avoid hardcoding your AccessKey ID or AccessKey secret in code.
    o = ODPS(
        os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
        os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
        project='<your-default-project>',
        endpoint='<your-end-point>',
    )
    o.create_resource("test_packed.tar.gz", "archive", fileobj=open("packages.tar.gz", "rb"))
  • DataWorks ile yükleme. Bkz. Adım 1: Kaynak oluşturma veya mevcut kaynak yükleme.

Python UDF'de üçüncü taraf pakete başvurma

Python kullanıcı tanımlı işlevinde (UDF) üçüncü taraf paket kullanmak için UDF sınıfını değiştirin:

  1. Paket yolunu __init__ yöntemindeki sys.path listesine ekleyin.

  2. İçeri aktarma deyimini işlev gövdesine (evaluate işlevi veya process yöntemi) yerleştirin.

Önemli

İçeri aktarma deyimi dosyanın başında değil, işlev gövdesinin içinde yer almalıdır. Üçüncü taraf paketler yalnızca çalışma zamanında kullanılabilir. MaxCompute UDF'yi ayrıştırırken ayrıştırma ortamı üçüncü taraf paketleri içermez; bu nedenle üst düzey bir içeri aktarma hataya neden olur.

Örnek: UDF'de SciPy kullanma

Bu örnekte bir UDF içinde SciPy'nin psi işlevi kullanılmaktadır.

  1. SciPy'yi paketleyin.

    pyodps-pack -o scipy-bundle.tar.gz scipy
  2. UDF kodunu yazın ve test_psi_udf.py olarak kaydedin.

    import sys
    from odps.udf import annotate
    
    @annotate("double->double")
    class MyPsi(object):
        def __init__(self):
            # Add the package path to sys.path.
            # MaxCompute decompresses archive resources into folders under the work/ directory.
            # The folder name matches the resource name.
            # packages/ is the subdirectory created by pyodps-pack.
            sys.path.insert(0, "work/scipy-bundle.tar.gz/packages")
    
        def evaluate(self, arg0):
            # Place the import statement inside the function body.
            from scipy.special import psi
    
            return float(psi(arg0))
  3. test_psi_udf.py dosyasını Python kaynağı olarak, scipy-bundle.tar.gz dosyasını ise arşiv kaynağı olarak yükleyin.

  4. UDF'yi oluşturun, her iki kaynağa da başvurun ve sınıf adını test_psi_udf.MyPsi olarak ayarlayın. Bunu bir PyODPS düğümünde veya MaxCompute istemcisinde yapın.

    • PyODPS düğümünde:

      import os
      from odps import ODPS
      
      # Load credentials from environment variables.
      # Avoid hardcoding your AccessKey ID or AccessKey secret in code.
      o = ODPS(
          os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
          os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
          project='<your-default-project>',
          endpoint='<your-end-point>',
      )
      
      bundle_res = o.create_resource(
          "scipy-bundle.tar.gz", "archive", fileobj=open("scipy-bundle.tar.gz", "rb")
      )
      udf_res = o.create_resource(
          "test_psi_udf.py", "py", fileobj=open("test_psi_udf.py", "rb")
      )
      o.create_function(
          "test_psi_udf", class_type="test_psi_udf.MyPsi", resources=[bundle_res, udf_res]
      )
    • MaxCompute istemcisinde:

      add archive scipy-bundle.tar.gz;
      add py test_psi_udf.py;
      create function test_psi_udf as test_psi_udf.MyPsi using test_psi_udf.py,scipy-bundle.tar.gz;
  5. UDF'yi bir SQL deyimi içinde çalıştırın.

    set odps.pypy.enabled=false;
    set odps.isolation.session.enable=true;
    select test_psi_udf(sepal_length) from iris;

PyODPS DataFrame'de üçüncü taraf pakete başvurma

execute veya persist yöntemine libraries parametresini iletin. Aşağıdaki örnek map yöntemini kullanır; yordam apply ve map_reduce yöntemleri için de aynıdır.

  1. SciPy'yi paketleyin.

    pyodps-pack -o scipy-bundle.tar.gz scipy
  2. Paketi bir DataFrame işlemine uygulamak için aşağıdaki kodu çalıştırın. Bu örnek, tek bir FLOAT türünde sütuna sahip test_float_col adlı bir tabloda psi(col1) değerini hesaplar.

    import os
    from odps import ODPS, options
    
    def my_psi(v):
        from scipy.special import psi
    
        return float(psi(v))
    
    # Skip this setting if isolation is already enabled for your project.
    options.sql.settings = {"odps.isolation.session.enable": True}
    
    # Load credentials from environment variables.
    # Avoid hardcoding your AccessKey ID or AccessKey secret in code.
    o = ODPS(
        os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
        os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
        project='<your-default-project>',
        endpoint='<your-end-point>',
    )
    df = o.get_table("test_float_col").to_df()
    
    # Execute and return the result.
    df.col1.map(my_psi).execute(libraries=["scipy-bundle.tar.gz"])
    
    # Save the result to another table.
    df.col1.map(my_psi).persist("result_table", libraries=["scipy-bundle.tar.gz"])

    Giriş verileri şu şekildedir:

       col1
    0  3.75
    1  2.51
  3. (İsteğe bağlı) Oturumdaki tüm DataFrame işlemlerinde aynı paketi kullanmak için genel parametreyi ayarlayın.

    from odps import options
    options.df.libraries = ["scipy-bundle.tar.gz"]

DataWorks'te üçüncü taraf pakete başvurma

DataWorks PyODPS düğümü dahili üçüncü taraf paketler sağlar. Dahili olmayan bir paket kullanmak için load_resource_package yöntemini çağırın. Ayrıntılar için bkz. Üçüncü taraf paket kullanma.

Üçüncü taraf paketi elle yükleme ve buna başvurma

Bu yönergeleri yalnızca zaten elle yüklenmiş WHL bağımlılıkları kullanan mevcut projeler için veya ikili paketleri desteklemeyen erken bir MaxCompute sürümü çalıştıran ortamlar için izleyin. Yeni projeler için bunun yerine pyodps-pack kullanın.

Bu örnekte map yönteminde python-dateutil kullanılmaktadır.

  1. python-dateutil ve bağımlılıklarını yerel bir dizine indirin. Paketlerin Linux işletim sistemiyle uyumlu olduğundan emin olmak için bu komutu Linux'ta çalıştırın.

    pip download python-dateutil -d /to/path/

    İki paket indirilir: six-1.10.0-py2.py3-none-any.whl ve python_dateutil-2.5.3-py2.py3-none-any.whl.

  2. Paketleri MaxCompute'a yükleyin.

    • Yöntem 1: Kod kullanma.

      # Make sure the file name extensions are valid.
      odps.create_resource('six.whl', 'file', file_obj=open('six-1.10.0-py2.py3-none-any.whl', 'rb'))
      odps.create_resource('python_dateutil.whl', 'file', file_obj=open('python_dateutil-2.5.3-py2.py3-none-any.whl', 'rb'))
    • Yöntem 2: DataWorks kullanma. Bkz. Adım 1: Kaynak oluşturma veya mevcut kaynak yükleme.

  3. Paketlere kodunuzda başvurun. Bu örnek, bir DataFrame sütunundaki tarih dizelerini ayrıştırır.

    • Kitaplıkları genel olarak ayarlama:

      from odps import options
      
      def get_year(t):
          from dateutil.parser import parse
          return parse(t).strftime('%Y')
      
      options.df.libraries = ['six.whl', 'python_dateutil.whl']
      df.datestr.map(get_year).execute()

      Çıktı:

         datestr
      0     2016
      1     2015
    • Kitaplıkları çağrı başına iletme:

      def get_year(t):
          from dateutil.parser import parse
          return parse(t).strftime('%Y')
      
      df.datestr.map(get_year).execute(libraries=['six.whl', 'python_dateutil.whl'])

      Çıktı:

         datestr
      0     2016
      1     2015

İkili paket uyumluluğu

PyODPS varsayılan olarak yalnızca Python kodu içeren ve dosya işlemleri gerçekleştirmeyen Python kitaplıklarını destekler. MaxCompute'in sonraki sürümleri ayrıca ikili kod veya dosya işlemleri içeren kitaplıkları da destekler. Kitaplık adları platforma özgü bir sonek içermelidir.

Aşağıdaki tabloda platforma ve Python sürümüne göre desteklenen sonekler listelenmiştir.


Platform


Python sürümü


Desteklenen sonek


RHEL 5 x86_64


Python 2.7


cp27-cp27m-manylinux1_x86_64


RHEL 5 x86_64


Python 3.7


cp37-cp37m-manylinux1_x86_64


RHEL 7 x86_64


Python 2.7


cp27-cp27m-manylinux1_x86_64, cp27-cp27m-manylinux2010_x86_64, cp27-cp27m-manylinux2014_x86_64


RHEL 7 x86_64


Python 3.7


cp37-cp37m-manylinux1_x86_64, cp37-cp37m-manylinux2010_x86_64, cp37-cp37m-manylinux2014_x86_64


RHEL 7 Arm64


Python 3.7


cp37-cp37m-manylinux2014_aarch64

Tüm WHL paketleri MaxCompute'a arşiv kaynağı olarak yüklenmelidir. Yüklemeden önce her bir WHL dosyasının uzantısını değiştirerek ZIP dosyası olarak yeniden adlandırın. Ayrıca iş veya projeniz için odps.isolation.session.enable değerini True olarak ayarlayın.

Aşağıdaki örnek, SciPy'yi ikili paket olarak yükler ve kullanır.

# Binary packages must be uploaded as archive resources.
# Rename the .whl file to .zip before uploading.
odps.create_resource('scipy.zip', 'archive', file_obj=open('scipy-0.19.0-cp27-cp27m-manylinux1_x86_64.whl', 'rb'))

# Skip this setting if isolation is already enabled for your project.
options.sql.settings = { 'odps.isolation.session.enable': True }

def my_psi(value):
    # Place the import statement inside the function to avoid runtime errors
    # caused by structural differences in binary packages across operating systems.
    from scipy.special import psi
    return float(psi(value))

df.float_col.map(my_psi).execute(libraries=['scipy.zip'])

Yalnızca kaynak içeren ikili paketleri WHL dosyalarına paketlemek için aşağıdaki komutu Linux'ta çalıştırın. macOS veya Windows üzerinde oluşturulan WHL dosyaları MaxCompute'da kullanılamaz.

python setup.py bdist_wheel