All Products
Search
Document Center

MaxCompute:Contoh UDF: Gunakan paket pihak ketiga dalam Python UDF

Last Updated:Mar 27, 2026

MaxCompute mendukung penggunaan paket pihak ketiga dalam user-defined function (UDF) Python. Bergantung pada jenis paketnya, proses unggah dan registrasi berbeda. Topik ini mencakup tiga skenario: paket NumPy (Python 3), paket yang memerlukan kompilasi, dan paket yang bergantung pada dynamic-link library (DLL).

Prasyarat

Sebelum memulai, pastikan Anda telah:

  • Python telah terinstal (disarankan menggunakan Python 3)

  • menginstal dan mengonfigurasi MaxCompute client — lihat Instal dan konfigurasi MaxCompute client

  • menginstal pip, setuptools, dan wheel jika paket Anda memerlukan kompilasi:

    pip install setuptools
    pip install wheel
  • menginstal PROJ 6 jika paket Anda bergantung pada GDAL 3.0 atau versi lebih baru

  • menginstal Docker jika Anda berencana melakukan kompilasi di Windows — lihat dokumentasi Docker

Pilih skenario

Skenario Gunakan saat
Referensikan paket NumPy dalam UDF Python 3 Anda membutuhkan NumPy di Python 3. NumPy sudah pra-instal di Python 2, sehingga tidak perlu diunggah secara manual untuk Python 2.
Paket referensi yang memerlukan kompilasi Paket Anda berupa file TAR.GZ dari PyPI atau paket kode sumber dari GitHub yang berisi file setup.py di direktori root-nya.
Mereferensikan paket yang bergantung pada DLL Paket Anda bergantung pada DLL, seperti GDAL 3.0.4.

Referensikan paket NumPy dalam UDF Python 3

Gunakan jalur ini saat: Anda menggunakan Python 3 dan membutuhkan pustaka NumPy. NumPy sudah pra-instal di Python 2, sehingga tidak perlu unggah manual untuk Python 2.

  1. Buka halaman NumPy di PyPI dan, di bagian Download files, unduh paket yang namanya diakhiri dengan cp37-cp37m-manylinux1_x86_64.whl. Contoh ini menggunakan NumPy 1.19.2. Paket dengan akhiran lain mungkin gagal saat runtime. Untuk menggunakan versi berbeda, klik Release history di bagian Navigation untuk menelusuri rilis historis.

    NumPy download page on PyPI

  2. Ubah nama file yang diunduh dengan mengganti ekstensinya dari .whl menjadi .zip. Contoh: numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip

  3. Unggah paket .zip ke proyek MaxCompute Anda menggunakan MaxCompute client. Untuk detailnya, lihat Operasi resource.

    ADD ARCHIVE D:\Downloads\numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip -f;
  4. Buat skrip UDF Python dan simpan sebagai file .py. Contoh ini menyimpan file sebagai import_numpy.py.

    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') # Perbarui nama file setelah work/ agar sesuai dengan nama paket Anda.
    
        def evaluate(self):
            import numpy
            return "import succeed"
  5. Unggah skrip tersebut ke proyek MaxCompute Anda sebagai resource.

    ADD PY D:\Desktop\import_numpy.py -f;
  6. Buat UDF menggunakan skrip dan paket NumPy yang telah diunggah. Untuk detailnya, lihat Operasi fungsi. Contoh ini memberi nama UDF numpy. Sertakan file .zip NumPy dalam daftar resource.

    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';
  7. Panggil UDF dalam pernyataan SQL. Python 3 harus diaktifkan sebelum menjalankan SQL. Untuk detailnya, lihat Python 3 UDF.

Paket referensi yang memerlukan kompilasi

Gunakan jalur ini saat: Paket Anda berupa file TAR.GZ dari PyPI atau paket kode sumber dari GitHub yang berisi file setup.py di direktori root-nya. Anda harus mengompilasi setup.py untuk menghasilkan paket wheel di lingkungan yang kompatibel dengan MaxCompute, lalu mengunggahnya dan membuat UDF.

Paket pihak ketiga dijalankan di lingkungan Linux. Lakukan kompilasi di Linux untuk menghindari masalah kompatibilitas. Jika Anda menggunakan Windows, gunakan Docker.

Kompilasi di Linux

Sebelum mengompilasi, verifikasi bahwa lingkungan Anda memenuhi persyaratan berikut:

Kompatibilitas Python: Jalankan perintah berikut untuk memeriksa tag ABI:

python -c "import wheel.pep425tags; print(wheel.pep425tags.get_abi_tag())"
  • Jika mengembalikan cp27m atau cp37m, versi Python tersebut kompatibel.

  • Jika mengembalikan cp27mu atau cp37mu, jalankan ./configure --enable-unicode=ucs2 untuk mengubah format encoding ke UCS-2.

Kompatibilitas GNU Compiler Collection (GCC): Gunakan GCC 4.9.2 atau versi sebelumnya. Versi yang lebih baru dapat menghasilkan file .so yang tidak kompatibel dengan MaxCompute.

Setelah lingkungan Anda siap:

  1. Ekstrak paket dan arahkan ke direktori yang berisi setup.py. Contoh: setelah mengekstrak GDAL-3.2.0.zip, file setup.py berada di D:\Downloads\GDAL-3.2.0.

    Decompressed package directory structure

    cd D:\Downloads\GDAL-3.2.0
  2. Periksa apakah bdist_wheel tersedia:

    python setup.py --help-command
    • Jika bdist_wheel muncul dalam output, lanjutkan ke langkah berikutnya.

    • Jika bdist_wheel tidak tercantum, buka setup.py, ubah from distutils.core import setup menjadi from setuptools import setup, lalu lanjutkan.

  3. Kompilasi setup.py untuk menghasilkan paket wheel:

    python setup.py bdist_wheel

    Paket wheel disimpan di folder dist.

Setelah menghasilkan paket wheel, ubah ekstensinya dari .whl menjadi .zip, lalu unggah sebagai resource dan buat UDF. Ikuti langkah-langkah yang sama seperti pada Referensikan paket NumPy dalam UDF Python 3.

Kompilasi di Windows menggunakan Docker

Di Windows, lakukan kompilasi di dalam kontainer Docker dari image quay.io/pypa/manylinux2010_x86_64. Binari Python untuk versi yang diperlukan tersedia di:

  • Python 2: /opt/python/cp27-cp27m/bin/python

  • Python 3: /opt/python/cp37-cp37m/bin/python3

Jalankan python setup.py bdist_wheel di dalam kontainer untuk menghasilkan paket wheel, lalu ubah ekstensinya dari .whl menjadi .zip dan ikuti langkah unggah serta pembuatan UDF pada Referensikan paket NumPy dalam UDF Python 3.

Referensikan paket yang bergantung pada DLL

Gunakan jalur ini saat: Paket Anda bergantung pada DLL. Contoh ini menggunakan GDAL 3.0.4, yang bergantung pada libgdal dan numpy. Kompilasi dilakukan di dalam kontainer Docker dari image quay.io/pypa/manylinux2010_x86_64. Pastikan Docker telah diinstal sebelum melanjutkan — lihat dokumentasi Docker.

Langkah 1: Periksa dependensi

Buka halaman GDAL di PyPI dan tinjau bagian Dependencies.

GDAL dependencies on PyPI

GDAL 3.0.4 memerlukan libgdal dan numpy. Anda akan mengompilasi libgdal dari kode sumber dan memperoleh numpy secara terpisah.

Langkah 2: Dapatkan paket NumPy

Gunakan salah satu metode berikut:

  • Buka halaman NumPy di PyPI dan, di bagian Download files, unduh paket yang diakhiri dengan cp37-cp37m-manylinux1_x86_64.whl. Untuk Python 2, klik Release history di bagian Navigation, pilih versi 1.16.6 atau sebelumnya, lalu unduh paket yang diakhiri dengan cp27-cp27m-manylinux1_x86_64.whl.

  • Jalankan perintah berikut di dalam kontainer untuk mengunduh NumPy secara langsung:

    /opt/python/cp37-cp37m/bin/pip download numpy -d ./

Langkah 3: Kompilasi file pustaka .so

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

  2. Ambil image Docker dan mulai kontainer:

    docker pull quay.io/pypa/manylinux2010_x86_64
    docker run -it quay.io/pypa/manylinux1_x86_64 /bin/bash
  3. Salin kode sumber GDAL ke dalam kontainer. Ganti <CONTAINER ID> dengan ID kontainer aktual (lihat docker ps untuk cara mendapatkannya):

    docker cp ./gdal-3.0.4 <CONTAINER ID>:/opt/source/
  4. Kompilasi kode sumber GDAL di dalam kontainer. Untuk instruksi build lengkap, lihat BuildingOnUnix.

    # Tentukan direktori instalasi PROJ 6 pada langkah 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
    # Verifikasi build.
    gdalinfo --version

    Jika Anda mengalami error selama kompilasi:

    • configure: error: PROJ 6 symbols not found — instal PROJ 6 untuk mendukung GDAL 3.0 atau versi lebih baru.

    • fatal error: zlib.h: No such file or directory — jalankan yum install zlib-devel dan coba lagi.

  5. Salin dua file pustaka .so (bukan tautan simbolik) dari kontainer ke mesin Anda:

    • libgdal.so dari folder lib di direktori instalasi GDAL

    • libproj.so dari folder lib di direktori instalasi PROJ 6

Langkah 4: Hasilkan paket wheel GDAL

Jalankan perintah berikut di dalam kontainer. Untuk konteks lebih lanjut, lihat BuildingOnUnix.

# Instal NumPy jika diperlukan.
/opt/python/cp37-cp37m/bin/pip install numpy
# Beralih ke direktori binding Python GDAL.
cd swig/python
# Hasilkan paket wheel. Output: dist/GDAL-3.0.4-cp37-cp37m-linux_x86_64.whl
/opt/python/cp37-cp37m/bin/python setup.py bdist_wheel

Langkah 5: Unggah resource dan buat UDF

  1. Ubah ekstensi file paket wheel dari .whl menjadi .zip.

  2. Unggah resource ke proyek MaxCompute Anda:

    • Unggah libgdal.so dan libproj.so sebagai file resource.

    • Unggah numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip dan GDAL-3.0.4-cp37-cp37m-linux_x86_64.zip sebagai archive resource.

  3. Buat UDF dan tambahkan keempat file tersebut ke daftar resource: 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. Untuk langkah unggah dan pembuatan UDF, lihat Referensikan paket NumPy dalam UDF Python 3. Kode contoh UDF Python 3 berikut mengimpor GDAL:

    # 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') # Perbarui nama file setelah work/ agar sesuai dengan paket GDAL hasil kompilasi Anda.
            sys.path.insert(0, 'work/numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip') # Perbarui nama file setelah work/ agar sesuai dengan paket NumPy Anda.
    
        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"

    Jika Anda mendapat error yang menyatakan libgdal.so.26 atau libproj.so.15 tidak ditemukan, perbarui nama file dalam pemanggilan include_file() agar sesuai dengan nama file .so ber-versi aktual di sistem Anda (misalnya, ubah libgdal.so menjadi libgdal.so.26). Untuk Python 2, parameter get_cache_file berbeda. Lihat Referensi resource di topik "Kembangkan UDF dalam Python 2".

Langkah selanjutnya