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:
|
|
|
|
|
|
|
|
|
|
|
|
Üçü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.gzifadesini 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:
Paket yolunu
__init__yöntemindekisys.pathlistesine ekleyin.İçeri aktarma deyimini işlev gövdesine (
evaluateişlevi veyaprocessyöntemi) yerleştirin.
İç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.
-
SciPy'yi paketleyin.
pyodps-pack -o scipy-bundle.tar.gz scipy -
UDF kodunu yazın ve
test_psi_udf.pyolarak 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)) test_psi_udf.pydosyasını Python kaynağı olarak,scipy-bundle.tar.gzdosyasını ise arşiv kaynağı olarak yükleyin.-
UDF'yi oluşturun, her iki kaynağa da başvurun ve sınıf adını
test_psi_udf.MyPsiolarak 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;
-
-
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.
-
SciPy'yi paketleyin.
pyodps-pack -o scipy-bundle.tar.gz scipy -
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_coladlı bir tablodapsi(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 -
(İ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.
-
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.whlvepython_dateutil-2.5.3-py2.py3-none-any.whl. -
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.
-
-
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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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