全部产品
Search
文档中心

MaxCompute:Contoh: Mengacu paket pihak ketiga dalam Python UDF

更新时间:Jul 02, 2025

MaxCompute memungkinkan Anda untuk mengacu paket pihak ketiga dalam fungsi yang ditentukan pengguna (UDF) Python. Paket-paket tersebut dapat berupa paket NumPy, paket pihak ketiga yang perlu dikompilasi, dan paket pihak ketiga yang bergantung pada pustaka tautan dinamis (DLL). Topik ini menjelaskan cara mengacu paket pihak ketiga dalam Python UDF.

Informasi latar belakang

Anda dapat mengacu paket pihak ketiga dalam Python UDF dalam skenario berikut:

  • Mengacu Paket NumPy dalam Python 3 UDF

    Anda harus mengubah ekstensi nama paket NumPy, menggunakan klien MaxCompute untuk mengunggah paket NumPy, dan kemudian membuat UDF. Anda dapat memanggil Python 3 UDF setelah pembuatan UDF.

  • Mengacu Paket Pihak Ketiga yang Perlu Dikompilasi

    Anda harus mengkompilasi skrip setup.py dalam paket pihak ketiga, menghasilkan paket wheel, dan kemudian mengubah ekstensi nama paket wheel dalam lingkungan yang kompatibel dengan MaxCompute. Kemudian, gunakan klien MaxCompute untuk mengunggah paket wheel dan membuat UDF. Anda dapat memanggil Python UDF setelah pembuatan UDF. Kami merekomendasikan penggunaan sistem operasi Linux. Jika Anda menggunakan sistem operasi Windows, kami merekomendasikan penggunaan Docker.

  • Mengacu Paket Pihak Ketiga yang Bergantung pada DLL

    Anda harus mengkompilasi file pustaka .so berdasarkan kode sumber paket pihak ketiga, menghasilkan paket wheel, dan kemudian mengubah ekstensi nama paket wheel. Kemudian, gunakan klien MaxCompute untuk mengunggah paket wheel dan file pustaka .so serta membuat UDF. Anda dapat memanggil Python UDF setelah pembuatan UDF.

Prasyarat

Pastikan persyaratan berikut terpenuhi:

  • Python telah diinstal. Kami merekomendasikan instalasi Python 3.

  • Klien MaxCompute telah diinstal dan dikonfigurasi. Untuk informasi lebih lanjut, lihat Instal dan Konfigurasikan Klien MaxCompute.

  • pip, setuptools, dan wheel telah diinstal jika Anda ingin menggunakan Python UDF untuk mengacu paket pihak ketiga yang perlu dikompilasi. Anda dapat menjalankan perintah pip install setuptools untuk menginstal setuptools dan menjalankan perintah pip install wheel untuk menginstal wheel.

  • PROJ 6 diinstal jika Anda menggunakan paket pihak ketiga GDAL 3.0 atau yang lebih baru.

  • Docker diinstal jika Anda menggunakan Docker untuk mengkompilasi paket pihak ketiga. Untuk informasi lebih lanjut, lihat Dokumentasi Docker.

Mengacu paket NumPy dalam Python 3 UDF

Anda dapat menggunakan Python 3 di MaxCompute untuk mengacu paket NumPy. Secara default, pustaka NumPy diinstal di Python 2 di MaxCompute. Anda tidak perlu mengunggah paket NumPy secara manual di Python 2. Untuk mengacu paket NumPy dalam Python 3 UDF, lakukan langkah-langkah berikut:

  1. Di bagian Download files halaman PyPI, klik paket yang namanya diakhiri dengan cp37-cp37m-manylinux1_x86_64.whl untuk mengunduh paket. Dalam contoh ini, NumPy 1.19.2 digunakan.

    download numpy package

    Catatan

    Jika Anda mengunduh paket yang namanya diakhiri dengan karakter lain, operasi mungkin gagal. Jika Anda perlu memilih versi lain dari paket NumPy, klik Release history di bagian Navigation di pojok kiri atas halaman PyPI untuk melihat versi historis.

  2. Ubah ekstensi nama paket NumPy yang diunduh menjadi .zip.

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

  3. Gunakan klien MaxCompute untuk mengunggah paket NumPy ke proyek MaxCompute Anda. Untuk informasi lebih lanjut tentang cara mengunggah paket, lihat Operasi Sumber Daya.

    Perintah contoh:

    ADD ARCHIVE D:\Downloads\numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip -f;
  4. Tulis skrip Python UDF dan simpan skrip sebagai file PY.

    Dalam contoh ini, file yang disimpan diberi nama import_numpy.py. Kode berikut menunjukkan skrip Python UDF:

    from odps.udf import annotate
    
    @annotate("->string")
    class TryImport(object): # Nama kelas adalah TryImport. 
        def __init__(self):
            import sys
            sys.path.insert(0, 'work/numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip') # Paket NumPy. Anda hanya perlu mengubah nama paket setelah work/. 
    
        def evaluate(self):
            import numpy
            return "import berhasil"
  5. Gunakan klien MaxCompute untuk mengunggah skrip import_numpy.py ke proyek MaxCompute Anda sebagai sumber daya.

    Perintah contoh:

    ADD PY D:\Desktop\import_numpy.py -f;
  6. Gunakan skrip import_numpy.py yang diunggah dan paket NumPy untuk membuat UDF di klien MaxCompute. Untuk informasi lebih lanjut tentang cara membuat UDF, lihat Operasi Fungsi.

    Dalam contoh ini, UDF yang dibuat diberi nama numpy. Perintah contoh:

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

    Saat Anda membuat UDF, Anda harus menambahkan paket NumPy, seperti numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip, ke daftar sumber daya.

  7. Setelah Anda membuat UDF, Anda dapat memanggil UDF dalam pernyataan SQL. Pastikan bahwa Python 3 diaktifkan untuk mengeksekusi pernyataan SQL. Untuk informasi lebih lanjut, lihat Python 3 UDF.

Mengacu paket pihak ketiga yang perlu dikompilasi

Jika paket pihak ketiga adalah paket TAR.GZ yang diunduh dari PyPI atau paket kode sumber yang diunduh dari GitHub, file setup.py mungkin disimpan di direktori root dari paket pihak ketiga yang telah diekstraksi. Untuk menggunakan jenis paket pihak ketiga ini, Anda harus mengkompilasi file setup.py dan menghasilkan paket wheel dalam lingkungan yang kompatibel dengan MaxCompute. Kemudian, unggah paket sebagai sumber daya dan buat UDF. Setelah UDF dibuat, Anda dapat memanggil paket pihak ketiga dalam Python UDF. Untuk informasi lebih lanjut tentang cara mengunggah sumber daya dan membuat UDF, lihat Mengacu Paket NumPy dalam Python 3 UDF.

Penting
  • Paket pihak ketiga berjalan di sistem operasi Linux. Kami merekomendasikan Anda mengkompilasi paket pihak ketiga di sistem operasi Linux. Jika Anda mengkompilasi paket pihak ketiga di sistem operasi Windows, masalah ketidaksesuaian mungkin terjadi.

  • Jika Anda menggunakan sistem operasi Windows, kami merekomendasikan Anda menggunakan Python versi yang diperlukan untuk mengkompilasi file setup.py dan menghasilkan paket wheel di kontainer Docker yang dibuat dari gambar quay.io/pypa/manylinux2010_x86_64. Python versi yang diperlukan disimpan di /opt/python/cp27-cp27m/bin/python atau /opt/python/cp37-cp37m/bin/python3.

Jika Anda menggunakan sistem operasi Linux, pastikan persyaratan berikut terpenuhi:

  • Versi Python yang kompatibel dengan MaxCompute digunakan. Anda dapat menjalankan perintah berikut di antarmuka baris perintah (CLI) sistem Anda untuk memeriksa versi Python:

    python -c "import wheel.pep425tags; print(wheel.pep425tags.get_abi_tag())"
    • Jika cp27m atau cp37m dikembalikan, versi Python memenuhi persyaratan kompatibilitas.

    • Jika cp27mu atau cp37mu dikembalikan, versi Python tidak memenuhi persyaratan kompatibilitas. Dalam hal ini, Anda harus menjalankan perintah ./configure --enable-unicode=ucs2 untuk mengubah format penyandian Python menjadi UCS-2.

  • Jika kode dalam C atau C++ diperlukan, sistem operasi Linux Anda harus kompatibel dengan versi GNU Compiler Collection (GCC) yang digunakan.

    Catatan

    Kami merekomendasikan Anda menggunakan GCC 4.9.2 atau sebelumnya. Jika versi GCC lebih baru dari 4.9.2, file .so dalam paket wheel yang dihasilkan mungkin tidak kompatibel dengan MaxCompute.

Jika semua persyaratan terpenuhi, lakukan langkah-langkah berikut untuk mengkompilasi file setup.py dan menghasilkan paket wheel di sistem operasi Linux:

  1. Ekstrak paket pihak ketiga ke mesin lokal Anda dan jalankan perintah yang diperlukan di CLI untuk pergi ke jalur tempat file setup.py disimpan.

    Sebagai contoh, paket GDAL-3.2.0.zip diunduh. Setelah Anda mengekstrak paket, file setup.py disimpan di D:\Downloads\GDAL-3.2.0. Perintah contoh:

    cd D:\Downloads\GDAL-3.2.0

    ekstrak path

  2. Jalankan perintah berikut di CLI untuk memeriksa apakah bdist_wheel dikembalikan:

    Perintah contoh:

    python setup.py --help-command
    • Jika bdist_wheel dikembalikan, pergi ke Langkah 3.

    • Jika bdist_wheel tidak dikembalikan, ubah from distutils.core import setup menjadi from setuptools import setup dalam file setup.py. Kemudian, pergi ke Langkah 3.

  3. Jalankan perintah berikut di CLI untuk mengkompilasi file setup.py dan menghasilkan paket wheel:

    python setup.py bdist_wheel 
    Catatan

    Paket wheel disimpan di folder dist.

Mengacu paket pihak ketiga yang bergantung pada DLL

Beberapa paket pihak ketiga untuk Python bergantung pada pustaka Python dan DLL lainnya. Bagian ini menjelaskan cara menggunakan kontainer Docker untuk mengkompilasi file pustaka .so dan menghasilkan paket wheel yang dapat digunakan di MaxCompute. Kontainer dibuat dari gambar quay.io/pypa/manylinux2010_x86_64. GDAL 3.0.4 digunakan dalam contoh ini. Anda harus mengunggah file pustaka .so yang dihasilkan dan paket wheel atau paket NumPy sebagai sumber daya dan membuat UDF. Setelah UDF dibuat, Anda dapat memanggil paket pihak ketiga dalam Python UDF. Untuk informasi lebih lanjut tentang cara mengunggah sumber daya dan membuat UDF, lihat Mengacu Paket NumPy dalam Python 3 UDF.

Catatan

Anda harus memastikan bahwa Docker telah diinstal sebelum Anda dapat mengacu paket pihak ketiga yang bergantung pada DLL dalam Python UDF. Untuk informasi lebih lanjut, lihat Dokumentasi Docker.

Untuk mengacu paket pihak ketiga yang bergantung pada DLL dalam Python UDF, lakukan langkah-langkah berikut:

  1. Lihat dependensi di bagian Dependencies halaman PyPI.

    Gambar berikut menunjukkan dependensi GDAL 3.0.4.view dependencies

    Catatan

    Pada gambar sebelumnya, dependensi termasuk libgdal dan numpy. Untuk mendapatkan libgdal, kompilasi kode sumber GDAL dalam kontainer Docker. Untuk mendapatkan numpy, unduh paket NumPy di halaman PyPI atau dari kontainer Docker.

  2. Dapatkan paket NumPy.

    Anda dapat menggunakan salah satu metode berikut untuk mendapatkan paket NumPy:

    • Di bagian Download files halaman PyPI, klik paket yang namanya diakhiri dengan cp37-cp37m-manylinux1_x86_64.whl untuk mengunduh paket.

      Catatan

      Jika Python 2 digunakan, lakukan operasi berikut untuk mengunduh paket NumPy: Di bagian Navigation halaman PyPI, klik Release history, pilih 1.16.6 atau versi sebelumnya, dan kemudian klik paket yang namanya diakhiri dengan cp27-cp27m-manylinux1_x86_64.whl.

    • Jalankan perintah /opt/python/cp37-cp37m/bin/pip download numpy -d ./ di kontainer yang dibuat dari gambar quay.io/pypa/manylinux2010_x86_64 untuk mengunduh paket NumPy ke direktori saat ini.

  3. Kompilasi file pustaka .so.

    1. Unduh file kode sumber GDAL 3.0.4 dan ekstrak file ke mesin lokal Anda.

    2. Unduh kontainer Docker yang dibuat dari gambar quay.io/pypa/manylinux2010_x86_64 dan masuk ke mode input klien Docker.

      Perintah contoh:

      docker pull quay.io/pypa/manylinux2010_x86_64
      docker run -it quay.io/pypa/manylinux1_x86_64 /bin/bash
    3. Unggah kode sumber GDAL 3.0.4 ke kontainer Docker.

      Perintah contoh:

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

      Untuk informasi lebih lanjut tentang cara mendapatkan CONTAINER ID, lihat docker ps.

  4. Kompilasi kode sumber GDAL 3.0.4 dalam kontainer. Untuk informasi lebih lanjut, lihat BuildingOnUnix.

    Perintah contoh:

    # Tentukan direktori untuk menginstal PROJ 6 di bidang configure. 
    ./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
    # Tes
    gdalinfo --version

    Kesalahan berikut mungkin terjadi selama kompilasi:

    • configure: error: PROJ 6 symbols not found: Jika kesalahan ini terjadi, instal PROJ 6 untuk mendukung GDAL 3.0 atau yang lebih baru.

    • fatal error: zlib.h: No such file or directory: Jika kesalahan ini terjadi, gunakan perintah yum install zlib-devel untuk mengkompilasi kode tersebut.

  5. Jalankan perintah unduhan Docker untuk mengunduh dua file pustaka .so (bukan tautan simbolik) ke mesin lokal Anda. Dapatkan libgdal.so dari folder lib di direktori instalasi GDAL dan libproj.so dari folder lib di direktori instalasi PROJ 6.

  6. Hasilkan paket wheel GDAL di kontainer Docker. Untuk informasi lebih lanjut, lihat BuildingOnUnix.

    Perintah contoh:

    # Jika NumPy diperlukan, instal NumPy terlebih dahulu. 
    /opt/python/cp37-cp37m/bin/pip install numpy
    # Beralih ke direktori tempat kode sumber GDAL disimpan. 
    cd swig/python
    # Hasilkan paket wheel dan simpan di folder dist. Contoh: GDAL-3.0.4-cp37-cp37m-linux_x86_64.whl
    /opt/python/cp37-cp37m/bin/python setup.py bdist_wheel
  7. Unggah file pustaka .so yang dihasilkan, paket wheel, atau paket NumPy sebagai sumber daya dan buat UDF. Setelah UDF dibuat, Anda dapat memanggil paket pihak ketiga dalam Python UDF. Untuk informasi lebih lanjut tentang cara mengunggah sumber daya dan membuat UDF, lihat Mengacu Paket NumPy dalam Python 3 UDF.

    Perhatikan item berikut saat Anda mengunggah sumber daya dan membuat UDF:

    • Saat Anda mengunggah sumber daya, Anda harus mengunggah libgdal.so dan libproj.so sebagai sumber daya file dan numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip dan GDAL-3.0.4-cp37-cp37m-linux_x86_64.zip sebagai sumber daya arsip.

    • Saat Anda membuat fungsi, Anda harus menambahkan libgdal.so, libproj.so, numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip, dan GDAL-3.0.4-cp37-cp37m-linux_x86_64.zip ke daftar sumber daya fungsi.

    Kode contoh untuk Python UDF:

    Catatan

    Kode contoh berikut dijalankan di Python 3. Jika Anda ingin menjalankan kode di Python 2, perhatikan parameter get_cache_file. Untuk informasi lebih lanjut, lihat Referensi Sumber Daya dalam topik "Mengembangkan UDF di Python 2".

    # 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') # Paket GDAL setelah kompilasi. Anda hanya perlu mengubah nama paket yang mengikuti work/. 
            sys.path.insert(0, 'work/numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip') # Paket NumPy. Anda hanya perlu mengubah nama paket setelah 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 berhasil"
    Catatan

    Jika terjadi kesalahan yang menunjukkan libgdal.so.26 atau libproj.so.15 tidak ditemukan, Anda harus mengubah libgdal.so menjadi libgdal.so.26 atau libproj.so menjadi libproj.so.15.