All Products
Search
Document Center

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

Last Updated:Jul 18, 2026

MaxCompute memungkinkan penggunaan paket pihak ketiga dalam Python user-defined function (UDF), seperti paket NumPy, paket yang memerlukan kompilasi, atau paket yang bergantung pada dynamic-link library. Topik ini menjelaskan cara menggunakannya.

Informasi latar belakang

Paket pihak ketiga dapat digunakan dalam Python UDF pada skenario berikut:

  • Gunakan paket NumPy (Python 3 UDF)

    Anda harus mengubah ekstensi nama file paket NumPy, mengunggahnya menggunakan klien MaxCompute, lalu mendaftarkan fungsi tersebut agar dapat dipanggil dari Python 3 UDF Anda.

  • Gunakan paket pihak ketiga yang memerlukan kompilasi

    Dalam lingkungan yang kompatibel dengan MaxCompute, kompilasi skrip setup.py dalam paket pihak ketiga untuk menghasilkan paket wheel dan ubah ekstensi nama file paket tersebut. Kemudian, unggah paket dan daftarkan fungsinya menggunakan klien MaxCompute agar dapat dipanggil dari Python UDF Anda.

  • Gunakan paket pihak ketiga yang bergantung pada dynamic-link library

    Kompilasi file pustaka .so dari kode sumber paket pihak ketiga, hasilkan paket wheel, lalu ubah ekstensi nama file paket tersebut. Selanjutnya, unggah paket dan file pustaka .so menggunakan klien MaxCompute serta daftarkan fungsinya agar dapat dipanggil dari Python UDF Anda.

Prasyarat

Sebelum memulai, pastikan persyaratan berikut terpenuhi:

  • Python telah diinstal. Disarankan menggunakan Python 3.

  • Klien MaxCompute telah diinstal dan dikonfigurasi. Untuk informasi selengkapnya, lihat Instal dan konfigurasi klien MaxCompute.

  • Untuk paket yang memerlukan kompilasi, pastikan pip, setuptools, dan wheel telah diinstal. Jalankan perintah pip install setuptools untuk menginstal setuptools dan perintah pip install wheel untuk menginstal wheel.

  • Jika Anda menggunakan GDAL 3.0 atau versi yang lebih baru, pastikan PROJ 6 telah diinstal.

  • Jika Anda menggunakan Docker untuk mengompilasi paket pihak ketiga, pastikan Docker telah diinstal. Untuk informasi selengkapnya, lihat dokumentasi instalasi Docker.

Gunakan paket NumPy (Python 3 UDF)

Lingkungan Python 2 MaxCompute menyertakan NumPy secara default. Untuk menggunakan paket NumPy dalam Python 3 UDF, Anda harus mengunggah paket tersebut secara manual dengan mengikuti langkah-langkah berikut:

  1. Dengan mengambil versi 1.19.2 sebagai contoh, buka halaman PyPI. Di bagian Download files, unduh paket NumPy yang nama filenya diakhiri dengan cp37-cp37m-manylinux1_x86_64.whl.

    Catatan

    Pemuatan dapat gagal jika Anda menggunakan paket dengan ekstensi nama file yang berbeda. Jika ingin menggunakan versi lain, buka bagian Navigation di pojok kiri atas halaman PyPI dan klik Release history untuk melihat versi-versi sebelumnya.

  2. Ubah ekstensi nama file paket NumPy yang telah 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. Untuk informasi selengkapnya tentang cara mengunggah resource, lihat Operasi resource.

    Contoh perintah:

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

    Berikut adalah contoh skrip Python UDF yang disimpan 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') # Paket NumPy. Anda hanya perlu mengganti nama paket setelah work/.
    
        def evaluate(self):
            import numpy
            return "import succeed"
  5. Gunakan klien MaxCompute untuk mengunggah skrip import_numpy.py sebagai resource ke proyek MaxCompute Anda.

    Contoh perintah:

    ADD PY D:\Desktop\import_numpy.py -f;
  6. Gunakan skrip import_numpy.py dan paket NumPy yang telah diunggah untuk mendaftarkan fungsi user-defined melalui klien MaxCompute. Untuk informasi selengkapnya tentang cara mendaftarkan fungsi, lihat Operasi fungsi.

    Asumsikan fungsi user-defined yang didaftarkan diberi nama numpy dan resource fungsi tersebut berada di proyek test_project. Contoh perintah:

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

    Saat mendaftarkan fungsi, Anda harus menambahkan paket NumPy, seperti numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip, ke daftar resource.

  7. Setelah fungsi terdaftar, panggil fungsi tersebut dari Pernyataan SQL Anda. Pastikan Anda mengaktifkan Python 3 untuk eksekusi. Untuk informasi selengkapnya, lihat Spesifikasi pengembangan dan alur kerja Python 3 UDF.

Gunakan paket yang memerlukan kompilasi

Jika paket pihak ketiga berupa arsip TAR.GZ dari PyPI atau paket kode sumber dari GitHub, direktori root paket yang diekstrak mungkin berisi file setup.py. Sebelum dapat menggunakan jenis paket ini, Anda harus mengompilasi file setup.py untuk menghasilkan paket wheel dalam lingkungan yang kompatibel dengan MaxCompute. Setelah itu, unggah resource dan daftarkan fungsinya. Anda kemudian dapat memanggil paket pihak ketiga menggunakan Python UDF. Untuk informasi selengkapnya tentang cara mengunggah resource dan mendaftarkan fungsi, lihat Gunakan paket NumPy (Python 3 UDF).

Penting
  • Paket pihak ketiga dijalankan dalam lingkungan Linux di MaxCompute. Untuk menghindari masalah kompatibilitas, kompilasi paket tersebut dalam lingkungan Linux, bukan Windows.

  • Jika Anda menggunakan lingkungan Windows, kami menyarankan agar Anda menggunakan versi Python yang sesuai (/opt/python/cp27-cp27m/bin/python atau /opt/python/cp37-cp37m/bin/python3) untuk membuat paket wheel dalam kontainer Docker quay.io/pypa/manylinux2010_x86_64.

Jika Anda menggunakan lingkungan Linux, periksa poin-poin berikut untuk memastikan kompatibilitas:

  • Anda harus menggunakan versi Python yang kompatibel. Di antarmuka baris perintah (CLI) sistem Anda, jalankan perintah berikut untuk memeriksa kompatibilitas versi Python Anda:

    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. Anda harus menjalankan perintah ./configure --enable-unicode=ucs2 di CLI untuk mengatur encoding Python ke UCS-2.

  • Jika terdapat dependensi pada kode C atau C++, Anda harus menggunakan versi GNU Compiler Collection (GCC) yang kompatibel.

    Catatan

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

Setelah lingkungan Anda memenuhi persyaratan kompatibilitas, ikuti langkah-langkah berikut untuk menghasilkan paket wheel dari file setup.py:

  1. Ekstrak paket pihak ketiga ke direktori lokal. Di CLI sistem Anda, beralihlah ke folder tempat file setup.py berada.

    Misalnya, jika Anda mengunduh paket GDAL-3.2.0.zip dan mengekstraknya, file setup.py berada di direktori D:\Downloads\GDAL-3.2.0. Contoh perintah:

    cd D:\Downloads\GDAL-3.2.0
  2. Di CLI, jalankan perintah berikut untuk memeriksa apakah bdist_wheel ada dalam output.

    Contoh perintah:

    python setup.py --help-command
    • Jika bdist_wheel ada dalam output, lanjutkan ke Langkah 3.

    • Jika bdist_wheel tidak ada dalam output, Anda harus memodifikasi skrip setup.py. Ubah from distutils.core import setup menjadi from setuptools import setup. Kemudian, lanjutkan ke Langkah 3.

  3. Di CLI, jalankan perintah berikut untuk mengompilasi dan menghasilkan paket wheel.

    python setup.py bdist_wheel 
    Catatan

    Paket wheel berada di direktori dist.

Gunakan paket dengan dynamic-link libraries

Beberapa paket Python pihak ketiga mungkin bergantung pada dynamic-link library lain selain pustaka Python. Bagian ini menggunakan GDAL 3.0.4 sebagai contoh untuk menjelaskan cara menggunakan kontainer Docker quay.io/pypa/manylinux2010_x86_64 untuk mengompilasi file pustaka .so terkait dan menghasilkan paket wheel yang dapat digunakan di MaxCompute. Anda kemudian akan menggunakan file yang dihasilkan ini untuk diunggah sebagai resource dan mendaftarkan fungsi, sehingga memungkinkan Anda memanggil paket tersebut dari Python UDF. Untuk informasi selengkapnya tentang cara mengunggah resource dan mendaftarkan fungsi, lihat Gunakan paket NumPy (Python 3 UDF).

Catatan

Pastikan Docker telah diinstal sebelum melanjutkan. Untuk informasi selengkapnya tentang operasi Docker, lihat dokumentasi Docker.

Untuk menggunakan paket pihak ketiga yang bergantung pada file pustaka .so dalam Python UDF, ikuti langkah-langkah berikut:

  1. Lihat dependensinya. Anda dapat melihat dependensi di bagian Dependencies pada halaman PyPI.

    Misalnya, dependensi GDAL 3.0.4 adalah sebagai berikut.

    Dependencies
    
    - libgdal (3.0.4 atau lebih tinggi) dan file header (gdal-devel)
    - numpy (1.0.0 atau lebih tinggi) dan file header (numpy-devel) (tidak secara eksplisit diperlukan, tetapi banyak contoh dan utilitas tidak akan berfungsi tanpanya)
    Catatan

    Seperti yang ditunjukkan di atas, dependensinya mencakup libgdal dan numpy. libgdal diperoleh dengan mengompilasi kode sumber GDAL dalam kontainer, dan numpy diperoleh dengan mengunduh paket NumPy dari halaman PyPI atau dalam kontainer Docker.

  2. Unduh paket NumPy.

    Anda dapat mengunduh paket NumPy dengan salah satu metode berikut:

    • Di halaman PyPI, buka bagian Download files dan unduh paket NumPy yang nama filenya diakhiri dengan cp37-cp37m-manylinux1_x86_64.whl.

      Catatan

      Jika Anda menggunakan lingkungan Python 2, Anda harus mengunduh paket NumPy yang kompatibel. Di area Navigation di sisi kiri halaman PyPI, klik Release history, pilih versi 1.16.6 atau sebelumnya, lalu unduh paket yang nama filenya diakhiri dengan cp27-cp27m-manylinux1_x86_64.whl.

    • Dalam kontainer Docker quay.io/pypa/manylinux2010_x86_64, jalankan perintah /opt/python/cp37-cp37m/bin/pip download numpy -d ./ untuk mengunduh paket NumPy ke direktori saat ini.

  3. Kompilasi file pustaka .so.

    1. Unduh kode sumber GDAL 3.0.4 dan ekstrak ke direktori lokal.

    2. Gunakan Docker untuk menarik gambar kontainer quay.io/pypa/manylinux2010_x86_64 dan masuk ke mode terminal interaktif.

      Contoh perintah:

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

      Contoh perintah:

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

      Untuk mendapatkan CONTAINER ID, lihat docker ps.

  4. Kompilasi GDAL 3.0.4 dalam kontainer. Untuk informasi selengkapnya, lihat BuildingOnUnix.

    Contoh perintah:

    # Anda harus menentukan direktori instalasi PROJ 6 dalam opsi 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
    # Test
    gdalinfo --version

    Galat berikut mungkin terjadi selama kompilasi:

    • configure: error: PROJ 6 symbols not found: GDAL 3.0 dan versi yang lebih baru bergantung pada PROJ 6. Anda harus mengunduh dan menginstal PROJ 6.

    • fatal error: zlib.h: No such file or directory: Jalankan perintah yum install zlib-devel dan kompilasi ulang.

  5. Gunakan perintah docker cp untuk menyalin file libgdal.so dan libproj.so dari kontainer ke mesin lokal Anda. File-file ini berada di folder lib dari direktori instalasi masing-masing. Pastikan Anda menyalin file aslinya, bukan tautan simboliknya.

  6. Buat paket wheel GDAL dalam kontainer. Untuk informasi selengkapnya, lihat BuildingOnUnix.

    Contoh perintah:

    # Jika NumPy diperlukan, Anda harus menginstal NumPy terlebih dahulu.
    /opt/python/cp37-cp37m/bin/pip install numpy
    # Beralih ke direktori kode sumber GDAL.
    cd swig/python
    # Paket wheel dihasilkan di direktori dist. Contoh: GDAL-3.0.4-cp37-cp37m-linux_x86_64.whl
    /opt/python/cp37-cp37m/bin/python setup.py bdist_wheel
  7. Berdasarkan file pustaka .so, paket wheel, atau paket NumPy yang dihasilkan, unggah resource dan daftarkan fungsi untuk menggunakan paket pihak ketiga dalam Python UDF. Untuk informasi selengkapnya tentang cara mengunggah resource dan mendaftarkan fungsi, lihat Gunakan paket NumPy (Python 3 UDF).

    Perhatikan poin-poin berikut:

    • Saat mengunggah resource, Anda harus mengunggah libgdal.so dan libproj.so sebagai resource FILE, serta mengunggah numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip dan GDAL-3.0.4-cp37-cp37m-linux_x86_64.zip sebagai resource ARCHIVE.

    • Saat mendaftarkan 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 resource fungsi.

    Berikut adalah contoh kode untuk Python UDF:

    Catatan

    Contoh ini menggunakan kode Python 3 dan harus dijalankan dalam lingkungan Python 3. Jika Anda perlu menjalankannya dalam lingkungan Python 2, perhatikan penggunaan parameter get_cache_file. Untuk informasi selengkapnya, lihat Referensi resource.

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

    Jika Anda mengalami kesalahan waktu proses bahwa libgdal.so.26 atau libproj.so.15 tidak ditemukan, ubah nama file libgdal.so dan libproj.so yang diunggah menjadi libgdal.so.26 dan libproj.so.15, masing-masing.