All Products
Search
Document Center

MaxCompute:FAQ MaxCompute UDF (Python)

Last Updated:Aug 22, 2026

Topik ini menjelaskan pertanyaan umum (FAQ) mengenai fungsi yang didefinisikan pengguna (UDF) MaxCompute yang ditulis dalam Python.

Masalah kelas atau resource

Bagian ini menjelaskan masalah umum terkait kelas dan resource yang terjadi saat Anda memanggil UDF MaxCompute.

  • Gejala 1: Pesan error function 'xxx' cannot be resolved ditampilkan.

    • Penyebab:

      • Penyebab 1: Anda memanggil UDF MaxCompute dari proyek yang salah. UDF tersebut tidak berada di proyek MaxCompute saat ini. Misalnya, UDF tersebut didaftarkan di proyek pengembangan, tetapi Anda memanggilnya dari proyek produksi.

      • Penyebab 2: Kelas atau resource UDF MaxCompute salah.

      • Penyebab 3: Jenis resource yang digunakan oleh UDF MaxCompute salah. Misalnya, file PY memiliki jenis resource PY, tetapi metode get_cache_file dalam kode UDF memerlukan jenis FILE.

      • Penyebab 4: Resource yang digunakan oleh UDF MaxCompute sudah usang. Terjadi penundaan saat Anda mengunggah resource dari DataWorks ke MaxCompute, sehingga resource tersebut mungkin bukan versi terbaru.

      • Penyebab 5: Versi lingkungan Python salah. Secara default, MaxCompute menjalankan pekerjaan di lingkungan Python 2. Error terjadi jika kode Python berisi karakter non-ASCII.

    • Solusi:

      • Solusi untuk Penyebab 1: Di proyek tempat error terjadi, Anda dapat menjalankan perintah list functions; dari MaxCompute client untuk memverifikasi bahwa Fungsi yang Didefinisikan Pengguna (UDF) MaxCompute tersebut ada.

      • Solusi untuk Penyebab 2: Di MaxCompute client, jalankan perintah desc function <function_name>; dan verifikasi bahwa Class dan Resources dalam output benar.

        Jika salah, jalankan perintah create function <function_name> as <'package_to_class'> using <'resource_list'>; untuk mendaftarkan fungsi tersebut lagi. Dalam perintah ini, package_to_class adalah Python_script_name.class_name dan resource_list mencakup semua resource file, tabel, arsip, atau paket pihak ketiga yang perlu Anda referensikan di MaxCompute.

        Untuk informasi lebih lanjut, lihat Daftarkan fungsi.

      • Solusi untuk Penyebab 3: Di MaxCompute client, jalankan perintah desc resource <resource_name>; dan periksa apakah Type dalam output benar. Jika jenis resource salah, jalankan perintah add <file_type> <file_name>; untuk menambahkan resource tersebut lagi.

        • Jika resource direferensikan menggunakan get_cache_file dalam kode UDF, resource tersebut merupakan resource file. Jenis resource harus FILE.

        • Jika resource direferensikan menggunakan get_cache_table dalam kode UDF, resource tersebut merupakan resource tabel. Jenis resource harus TABLE.

        • Jika resource direferensikan menggunakan get_cache_archive dalam kode UDF, resource tersebut merupakan resource arsip. Jenis resource harus ARCHIVE.

        Untuk informasi lebih lanjut, lihat Tambahkan resource.

      • Solusi untuk Penyebab 4: Anda dapat menjalankan perintah desc resource <resource_name>; di MaxCompute client dan memeriksa LastModifiedTime dalam output untuk memverifikasi waktu modifikasi terakhir.

      • Solusi untuk Penyebab 5: Tambahkan deklarasi encoding #coding:utf-8 atau # -*- coding: utf-8 -*- di awal kode Python. Atau, tambahkan pernyataan set odps.sql.python.version=cp37; sebelum pernyataan SQL yang memanggil UDF. Kemudian, kirimkan bersama-sama untuk menjalankan pekerjaan di lingkungan Python 3.

  • Gejala 2: Saat Anda menggunakan get_cache_archive('xxx.zip') dalam UDF MaxCompute, salah satu pesan error berikut ditampilkan: IOError: Download resource: xxx.zip failed, odps.distcache.DistributedCacheError, atau fuxi job failed: Download resource failed: xxx.zip.

    • Penyebab:

      • Penyebab 1: Resource arsip tidak ada. Resource arsip tidak ditentukan saat Anda mendaftarkan UDF MaxCompute.

      • Penyebab 2: Jenis resource arsip salah. Bukan ARCHIVE.

      • Penyebab 3: Nama atau ekstensi resource arsip tidak sesuai dengan file aktual. Misalnya, resource arsip bernama xxx.zip, tetapi file yang diunggah adalah xxx.tar.gz. Sistem mencoba mengekstrak file dalam format ZIP, yang menyebabkan kegagalan ekstraksi.

      • Penyebab 4: Dua UDF dalam pekerjaan yang sama bergantung pada resource yang memiliki nama sama tetapi berada di proyek berbeda.

    • Solusi:

      • Solusi untuk Penyebab 1: Jalankan perintah desc function <function_name>; di MaxCompute client untuk memeriksa apakah bidang Resources dalam output berisi paket resource terkompresi yang disebutkan dalam pesan error.

        Jika tidak termasuk, jalankan perintah create function <function_name> as <'package_to_class'> using <'resource_list'>; untuk mendaftarkan fungsi tersebut lagi. Tambahkan resource arsip yang hilang ke resource_list.

        Untuk informasi lebih lanjut, lihat Daftarkan fungsi.

      • Solusi untuk Penyebab 2: Jalankan perintah desc resource <resource_name>; di MaxCompute client untuk memeriksa apakah Type dalam output adalah ARCHIVE.

        Jika jenisnya bukan ARCHIVE, jalankan perintah add archive <file_name>; untuk mengunggah resource tersebut lagi.

        Untuk informasi lebih lanjut, lihat Tambahkan resource.

      • Solusi untuk Penyebab 3: Di MaxCompute client, jalankan perintah desc function <function_name>; untuk memeriksa apakah nama dan ekstensi paket terkompresi dalam bagian Resources pada output sesuai dengan nama file dan ekstensi aktual.

        Jika tidak sesuai, jalankan perintah add archive <file_name>; untuk mengunggah resource tersebut lagi. file_name harus sama dengan nama dan ekstensi resource arsip aktual.

      • Solusi untuk Penyebab 4: Periksa semua UDF yang digunakan oleh pekerjaan tersebut, termasuk UDF dalam view. Periksa proyek dan nama setiap UDF serta resource yang sesuai. Jika resource dengan nama sama ada di proyek berbeda, ubah nama UDF atau resource yang bergantung tersebut.

  • Gejala 3: Saat Anda menggunakan get_cache_table(table_name) dalam UDF MaxCompute, pesan error odps.distcache.DistributedCacheError: Table resource "xxx_table_name" not found ditampilkan.

    • Penyebab:

      • Penyebab 1: Resource tabel tidak ada. Resource tabel tidak ditentukan saat Anda mendaftarkan UDF MaxCompute.

      • Penyebab 2: Jenis resource tabel salah. Bukan TABLE.

    • Solusi:

      • Solusi untuk Penyebab 1: Di MaxCompute client, jalankan perintah desc function <function_name>; dan periksa apakah Resources dalam output berisi resource tabel dari pesan error.

        Jika tidak termasuk, jalankan perintah create function <function_name> as <'package_to_class'> using <'resource_list'>; untuk mendaftarkan fungsi tersebut lagi. Tambahkan resource tabel yang hilang ke resource_list.

        Untuk informasi lebih lanjut, lihat Daftarkan fungsi.

      • Solusi untuk Penyebab 2: Di MaxCompute client, jalankan perintah desc resource <resource_name>; dan periksa apakah Type dalam output adalah TABLE.

        Jika jenisnya bukan TABLE, jalankan perintah add table <table_name>; untuk mengunggah resource tabel tersebut lagi.

        Untuk informasi lebih lanjut, lihat Tambahkan resource.

  • Gejala 4: Saat UDF MaxCompute mereferensikan paket pihak ketiga, pesan error ImportError: No module named 'xxx' ditampilkan.

    • Penyebab

      • Penyebab 1: Jenis resource dari paket pihak ketiga salah. Jenis resource harus ARCHIVE.

      • Penyebab 2: Paket pihak ketiga tidak ditentukan saat UDF MaxCompute didaftarkan.

      • Penyebab 3: Path ke paket pihak ketiga tidak ditambahkan ke kode UDF MaxCompute.

      • Penyebab 4: Paket pihak ketiga merupakan paket WHEEL, tetapi file memiliki ekstensi salah atau tidak sesuai dengan versi lingkungan Python.

      • Penyebab 5: Paket pihak ketiga bukan paket WHEEL atau paket Python murni, tetapi berisi file setup.py.

      • Penyebab 6: Nama file Python untuk UDF MaxCompute bertabrakan dengan nama modul pihak ketiga yang ingin Anda referensikan. Misalnya, jika file Python untuk UDF adalah A.py, sistem secara default mengimpor A.py alih-alih modul dari paket pihak ketiga saat Anda menjalankan import A.

    • Solusi:

      • Solusi untuk Penyebab 1: Dari MaxCompute client, jalankan perintah desc resource <resource_name>; dan periksa apakah parameter Type dalam output adalah ARCHIVE.

        Jika jenisnya bukan ARCHIVE, jalankan perintah add archive <file_name>; untuk mengunggah resource tersebut lagi.

        Untuk informasi lebih lanjut, lihat Tambahkan resource.

      • Solusi untuk Penyebab 2: Gunakan MaxCompute client untuk menjalankan perintah desc function <function_name>;, dan periksa apakah parameter Resources dalam output mencakup paket pihak ketiga.

        Jika tidak termasuk, jalankan perintah create function <function_name> as <'package_to_class'> using <'resource_list'>; untuk mendaftarkan fungsi tersebut lagi. Tambahkan paket pihak ketiga ke resource_list.

        Untuk informasi lebih lanjut, lihat Daftarkan fungsi.

      • Solusi untuk Penyebab 3: Periksa apakah path ke paket pihak ketiga ditambahkan ke kode fungsi yang didefinisikan pengguna (UDF). Secara khusus, pastikan kode mencakup sys.path.insert(0, 'work/path_to_third_party_package'). Misalnya, asumsikan nama modul adalah A dan file Python yang sesuai adalah A.py. Contoh berikut menjelaskan cara menentukan path paket resource dan menambahkan path tersebut ke kode Anda:

        • Jika file Python berada di folder resource_dir dan Anda langsung mengompresi folder resource_dir menjadi resource-of-A.zip, path dalam sys.path.insert adalah work/resource-of-A.zip/resource_dir/.

        • Jika file Python berada di folder resource_dir dan Anda mengompresi semua file dalam folder resource_dir menjadi resource-of-A.zip, path dalam sys.path.insert adalah work/resource-of-A.zip/.

        • Jika file Python berada di folder resource_dir/path1/path2 dan Anda mengompresi semua file dalam folder resource_dir menjadi resource-of-A.zip, path dalam sys.path.insert adalah work/resource-of-A.zip/path1/path2/.

        Catatan

        Secara default, resource ARCHIVE ditempatkan di direktori ./work/, yang relatif terhadap path eksekusi UDF.

      • Solusi untuk Penyebab 4: File WHEEL berbeda untuk lingkungan Python 2 dan Python 3. Untuk Python 2, nama file WHEEL harus mengandung cp27-cp27m-manylinux1_x86_64. Untuk Python 3, nama file WHEEL harus mengandung cp37-cp37m-manylinux1_x86_64. Unduh file WHEEL yang sesuai. Anda dapat langsung mengubah ekstensi file WHEEL yang diunduh menjadi .zip. Anda tidak perlu mengompresi file WHEEL ke dalam file ZIP lain.

      • Solusi untuk Penyebab 5: Anda harus terlebih dahulu mengompilasi file setup.py untuk menghasilkan paket WHEEL di lingkungan yang kompatibel dengan MaxCompute. Kemudian, unggah resource dan daftarkan fungsi tersebut. Untuk informasi lebih lanjut tentang cara mengompilasi paket pihak ketiga, lihat Gunakan paket pihak ketiga yang memerlukan kompilasi.

      • Solusi untuk Penyebab 6: Ubah nama file Python untuk UDF MaxCompute.

  • Gejala 5: Saat UDF MaxCompute mereferensikan pustaka standar Python 3, pesan error ImportError: No module named enum dilaporkan.

    • Penyebab: Python 3 tidak diaktifkan untuk proyek MaxCompute. Secara default, UDF MaxCompute berjalan di lingkungan Python 2, yang tidak dapat mengenali pustaka standar Python 3.

    • Solusi: Tambahkan pernyataan set odps.sql.python.version=cp37; sebelum pernyataan SQL yang memanggil UDF dan kirimkan bersama-sama.

  • Gejala 6: Pesan error ModuleNotFoundError: No module named 'six' ditampilkan.

    • Penyebab: Path ke paket pihak ketiga tidak ditambahkan ke sys.path. Hal ini mencegah UDF Python mengimpor paket tersebut.

    • Solusi: Untuk informasi lebih lanjut, lihat Jalankan Scipy dalam UDF MaxCompute. Ubah include_package_path('six.zip') menjadi sys.path.insert(0, 'work/six.zip').

  • Gejala 7: Pesan error failed to get Udf info from xxx.py dilaporkan.

    • Penyebab: Kelas dasar diimpor dengan sintaksis salah dalam fungsi nilai-tabel yang didefinisikan pengguna (UDTF) atau fungsi agregat yang didefinisikan pengguna (UDAF). Misalnya, import odps.udf.BaseUDTF atau import odps.udf.BaseUDAF.

    • Solusi: Ubah pernyataan impor menjadi from odps.udf import BaseUDTF atau from odps.udf import BaseUDAF.

Masalah performa

  • Gejala: Pesan error kInstanceMonitorTimeout ditampilkan.

  • Penyebab: Waktu pemrosesan UDF melebihi batas timeout. Secara default, satu batch catatan (biasanya 1.024) harus diproses dalam waktu 1.800 detik. Batas ini berlaku untuk pemrosesan satu batch, bukan total waktu proses worker. SQL biasanya memproses data lebih dari 10.000 catatan per detik. Batas ini mencegah loop tak hingga dalam UDF yang menyebabkan penggunaan CPU berkepanjangan.

  • Solusi:

    • Tambahkan log ke kode UDF MaxCompute untuk memeriksa adanya loop tak hingga. Anda juga dapat mencetak informasi waktu di log untuk memeriksa apakah waktu pemrosesan untuk satu catatan sesuai harapan. Tambahkan informasi pencetakan log berikut ke kode Anda. Setelah pekerjaan berhasil dijalankan, Anda dapat melihat informasi log di StdOut di Logview.

      • Lingkungan Python 2

        sys.stdout.write('your log')
        sys.stdout.flush()
      • Lingkungan Python 3

        print('your log', flush=True)
    • Jika komputasi aktual besar dan UDF diperkirakan berjalan lama, Anda dapat menyesuaikan parameter berikut untuk mencegah error timeout.

      Parameter

      Deskripsi

      set odps.function.timeout=xxx;

      Menyesuaikan periode timeout waktu proses UDF. Nilai default adalah 1800 detik. Anda dapat menambah nilai ini sesuai kebutuhan. Nilai harus dalam rentang 1 detik hingga 3600 detik.

      set odps.sql.executionengine.batch.rowcount=xxx;

      Menyesuaikan jumlah baris data yang diproses MaxCompute sekaligus. Nilai default adalah 1024. Anda dapat mengurangi nilai ini sesuai kebutuhan.

Masalah jaringan

  • Gejala: Terjadi error saat Anda memanggil UDF MaxCompute untuk mengakses internet.

  • Penyebab: UDF MaxCompute tidak mendukung akses internet.

  • Solusi: Isi dan kirimkan formulir Permintaan Koneksi Jaringan sesuai kebutuhan bisnis Anda. Tim dukungan teknis MaxCompute akan segera menghubungi Anda untuk mengaktifkan akses jaringan. Untuk petunjuk cara mengisi formulir, lihat Proses akses jaringan.

Masalah sandbox

  • Gejala: Pesan error RuntimeError: xxx has been blocked by sandbox ditampilkan.

  • Penyebab: Beberapa pemanggilan fungsi dalam UDF Python diblokir oleh sandbox.

  • Solusi:

    • Sebelum pernyataan SQL yang memanggil UDF Python, tambahkan pengaturan set odps.isolation.session.enable=true;. Kemudian, kirimkan bersama-sama.

    • Jika Anda menggunakan UDF Python 3, pengaturan set odps.isolation.session.enable=true; diaktifkan secara default.

Masalah encoding

Bagian ini menjelaskan masalah encoding umum yang terjadi saat memanggil UDF MaxCompute.

  • Gejala 1: Pesan error SyntaxError: Non-ASCII character '\xe8' in file xxx. on line yyy ditampilkan.

    • Penyebab: File Python untuk UDF MaxCompute berisi karakter non-ASCII dan berjalan di lingkungan Python 2.

    • Solusi:

      • Tambahkan pernyataan set odps.sql.python.version=cp37; sebelum pernyataan SQL yang memanggil UDF. Kemudian, kirimkan bersama-sama untuk menjalankan pekerjaan di lingkungan Python 3.

      • Ubah encoding default interpreter Python 2 menjadi UTF-8. Untuk melakukannya, tambahkan pernyataan berikut di awal file Python.

        import sys
        reload(sys)
        sys.setdefaultencoding('utf-8')
  • Gejala 2: Saat Anda memanggil UDF Python 2, pesan error UnicodeEncodeError: 'ascii' code can't encode characters in position x-y: ordinal not in range(128) ditampilkan.

    • Penyebab: Jenis tipe nilai kembali dalam signature fungsi adalah STRING, tetapi UDF MaxCompute mengembalikan objek Python bertipe UNICODE. Asumsikan objek tersebut bernama ret. Secara default, MaxCompute mencoba mengonversi nilai kembali ret ke tipe STR menggunakan format encoding ASCII dan mengembalikan str(ret). Jika ret hanya berisi karakter ASCII, konversi ke tipe STR berhasil. Namun, jika ret berisi karakter non-ASCII, konversi gagal dan error ditampilkan.

    • Solusi: Tambahkan pernyataan berikut ke metode evaluate dalam kode Python.

      return ret.encode('utf-8')
  • Gejala 3: Saat Anda memanggil UDF Python 3, pesan error UnicodeDecodeError: 'utf-8' codec can't decode byte xxx in position xxx: invalid continuation byte ditampilkan.

    • Penyebab: Jenis parameter input dalam signature fungsi adalah STRING. Namun, string input tidak dapat didekode menjadi objek Python bertipe STR menggunakan UTF-8 saat Anda memanggil UDF Python 3.

    • Solusi:

      • Hindari menulis string yang tidak diencode UTF-8 ke tabel MaxCompute.

        Misalnya, UDF Python 2 mengembalikan objek Python bertipe STR yang diencode dalam GBK. Objek ini dapat ditulis ke tabel MaxCompute, tetapi tidak dapat dibaca oleh UDF Python 3. Konversi data ke encoding UTF-8 sebelum UDF Python 2 mengembalikannya. Misalnya, kembalikan ret.decode('gbk').encode('utf-8').

      • Dalam pernyataan SQL, gunakan fungsi bawaan is_encoding untuk memfilter data yang tidak diencode UTF-8 terlebih dahulu. Kode berikut memberikan contoh.

        select py_udf(input_col) from example_table where is_encoding(input_col, 'utf-8', 'utf-8') = true;
      • Ubah jenis parameter input dalam signature fungsi dalam kode Python menjadi BINARY. Dalam pernyataan SQL, konversi kolom bertipe STRING ke tipe BINARY dan gunakan sebagai parameter input untuk UDF Python 3. Kode berikut memberikan contoh.

        select py_udf(cast(input_col as binary)) from example_table;

Masalah signature fungsi

Bagian ini menjelaskan masalah signature fungsi umum yang terjadi saat memanggil UDF MaxCompute.

  • Gejala 1: Pesan error resolve annotation of class xxx for UDTF/UDF/UDAF yyy contains invalid content '<EOF>' ditampilkan.

    • Penyebab: Parameter input atau output UDF MaxCompute merupakan tipe data kompleks, tetapi signature fungsinya tidak valid.

    • Solusi: Ubah tipe data kompleks dalam signature fungsi untuk memastikan signature tersebut valid. Untuk informasi lebih lanjut tentang signature fungsi, lihat Signature fungsi dan tipe data.

  • Gejala 2: Pesan error TypeError: expected <class 'xxx'> but <class 'yyy'> found, value:zzz ditampilkan.

    • Penyebab: Jenis tipe nilai kembali yang ditentukan dalam signature fungsi tidak sesuai dengan tipe data yang sebenarnya dikembalikan oleh kode UDF MaxCompute.

    • Solusi: Konfirmasi hasil kembali yang diharapkan. Ubah signature fungsi atau kode UDF MaxCompute untuk memastikan tipe datanya konsisten.

  • Gejala 3: Pesan error Semantic analysis exception - evaluate function in class xxx.yyy for user defined function zz does not match annotation ***->*** ditampilkan.

    • Penyebab: Jumlah parameter input yang ditentukan dalam signature fungsi tidak sesuai dengan jumlah parameter input dalam metode yang sesuai dalam kode UDF MaxCompute.

    • Solusi: Konfirmasi jumlah parameter input aktual. Ubah signature fungsi atau kode UDF MaxCompute untuk memastikan jumlah parameter input konsisten.

Masalah paket pihak ketiga

  • Gejala: Pesan error GLIBCXX_x.x.x not found ditampilkan.

  • Penyebab: Versi GLIBCXX yang digunakan oleh file library terhubung (.so) lebih baru daripada versi yang didukung oleh MaxCompute. Hal yang sama berlaku untuk GLIBC dan CXXABI.

  • Solusi: Gunakan paket WHEEL yang kompatibel atau kompilasi ulang file library terhubung (.so) di lingkungan yang kompatibel. Daftar berikut menunjukkan versi terbaru dependensi yang didukung untuk file executable biner atau file library terhubung (.so) di MaxCompute.

    GLIBC <= 2.17
    CXXABI <= 1.3.8
    GLIBCXX <= 3.4.19
    GCC <= 4.2.0

Masalah terkait UDTF

  • Gejala: Pesan error Semantic analysis exception - expect 2 aliases but have 0 ditampilkan.

  • Penyebab: Nama kolom output tidak ditentukan dalam kode UDTF Python.

  • Solusi: Tentukan nama kolom dalam klausa as dari pernyataan SELECT yang memanggil UDTF Python. Perintah berikut memberikan contoh.

    select my_udtf(col0, col1) as (ret_col0, ret_col1, ret_col2) from tmp1;

Masalah terkait UDAF

  • Gejala 1: Pesan error Script exception - ValueError: unmarshallable object ditampilkan.

    • Penyebab: buffer dalam kode UDAF Python bukan objek Marshal.

    • Solusi: Saat memberikan nilai ke buffer, pastikan nilainya merupakan objek Marshal. Misalnya, jika Anda ingin menggunakan dua buffer bertipe LIST dan DICT dalam Fungsi Agregat yang Didefinisikan Pengguna (UDAF) Python, metode new_buffer harus didefinisikan sebagai return [list(), dict()]. Saat menggunakan buffer/pbuffer dalam metode iterate/merge/terminate, buffer bertipe LIST sesuai dengan buffer[0]/pbuffer[0], dan buffer bertipe DICT sesuai dengan buffer[1]/pbuffer[1]. Jika elemen buffer bertipe LIST atau DICT, elemen tersebut juga harus merupakan objek Marshal.

  • Gejala 2: Pesan error Python UDAF buffer size overflowed: 2821486749 ditampilkan.

    • Penyebab: Ukuran buffer dalam UDAF Python melebihi 2 GB setelah diproses oleh Marshal. buffer digunakan secara salah. Ukuran buffer seharusnya tidak meningkat seiring volume data.

    • Solusi: Rancang ulang logika UDAF Python. Ukuran buffer seharusnya tidak meningkat seiring volume data. Misalnya, jika Anda mendeklarasikan buffer sebagai list, Anda tidak boleh terus-menerus menambahkan data ke buffer selama fase iterate dan merge. Untuk informasi lebih lanjut tentang UDAF Python, lihat Ikhtisar UDAF.