全部产品
Search
文档中心

:FAQ tentang Fungsi Python yang Didefinisikan Pengguna MaxCompute

更新时间:Jul 02, 2025

Topik ini menjawab pertanyaan umum terkait fungsi yang didefinisikan pengguna (UDF) MaxCompute yang ditulis dalam Python.

Kelas dan sumber daya

Masalah berikut mungkin terjadi terkait kelas atau sumber daya:

  • Deskripsi Masalah 1: Saat memanggil UDF MaxCompute, pesan kesalahan berikut dilaporkan: Fungsi 'xxx' tidak dapat diselesaikan.

    • Penyebab Potensial:

      • Penyebab 1: Proyek yang digunakan bukan proyek tempat UDF MaxCompute didaftarkan. Contohnya, jika UDF MaxCompute didaftarkan di proyek pengembangan tetapi dipanggil di proyek produksi, kesalahan akan dilaporkan.

      • Penyebab 2: Kelas atau sumber daya dari UDF MaxCompute tidak valid.

      • Penyebab 3: Jenis sumber daya yang bergantung pada UDF MaxCompute tidak valid. Misalnya, Anda mengunggah file Python bertipe PY, namun get_cache_file dalam kode UDF MaxCompute memerlukan sumber daya bertipe FILE.

      • Penyebab 4: Data sumber daya yang bergantung pada UDF MaxCompute bukan yang terbaru. Jika Anda mengunggah sumber daya ke MaxCompute menggunakan DataWorks, penundaan mungkin terjadi. Akibatnya, data sumber daya yang digunakan bukan yang terbaru.

      • Penyebab 5: Versi Python tidak didukung. Secara default, MaxCompute menggunakan Python 2 untuk menjalankan pekerjaan. Jika karakter non-ASCII ada dalam kode Python, kesalahan akan dilaporkan saat menjalankan kode tersebut.

    • Solusi:

      • Solusi 1: Pada Klien MaxCompute, jalankan perintah list functions; di proyek tempat kesalahan dilaporkan. Jika UDF MaxCompute tidak termasuk dalam output perintah, proyek tersebut bukan proyek tempat UDF MaxCompute didaftarkan. Buka proyek tempat UDF MaxCompute didaftarkan dan panggil UDF MaxCompute lagi.

      • Solusi 2: Pada Klien MaxCompute, jalankan perintah desc function <function_name>; dan periksa nilai Class dan Resources dalam output perintah.

        Jika nilai parameter Class atau Resources tidak valid, jalankan perintah create function <function_name> as <'package_to_class'> using <'resource_list'>; untuk mendaftarkan UDF lagi. Konfigurasikan parameter package_to_class dalam format nama skrip Python.Nama kelas. Gunakan parameter resource_list untuk menentukan semua sumber daya yang ingin direferensikan di MaxCompute, seperti file, tabel, paket terkompresi, dan paket pihak ketiga.

        Untuk informasi lebih lanjut tentang cara mendaftarkan fungsi, lihat Buat UDF.

      • Solusi 3: Pada Klien MaxCompute, jalankan perintah desc resource <resource_name>;. Periksa apakah jenis sumber daya yang ditentukan oleh parameter Type dalam output perintah valid. Jika jenis sumber daya tidak valid, jalankan perintah add <file_type> <file_name>; untuk mengunggah sumber daya lagi.

        • Jika metode referensi sumber daya yang digunakan dalam kode UDF MaxCompute adalah get_cache_file, file dirujuk dan jenis sumber daya harus FILE.

        • Jika metode referensi sumber daya yang digunakan dalam kode UDF MaxCompute adalah get_cache_table, tabel dirujuk dan jenis sumber daya harus TABLE.

        • Jika metode referensi sumber daya yang digunakan dalam kode UDF MaxCompute adalah get_cache_archive, paket terkompresi dirujuk dan jenis sumber daya harus ARCHIVE.

        Untuk informasi lebih lanjut tentang cara mengunggah sumber daya, lihat Tambahkan Sumber Daya.

      • Solusi 4: Pada Klien MaxCompute, jalankan perintah desc resource <resource_name>;. Periksa apakah data sumber daya merupakan yang terbaru berdasarkan nilai parameter LastModifiedTime dalam output perintah. Pastikan menggunakan sumber daya terbaru dalam UDF MaxCompute.

      • Solusi 5: Tambahkan #coding:utf-8 atau # -*- coding: utf-8 -*- ke header kode Python untuk mendeklarasikan format encoding. Anda juga dapat menambahkan perintah set odps.sql.python.version=cp37; sebelum pernyataan SQL yang digunakan untuk memanggil UDF MaxCompute dan kirimkan perintah bersama dengan pernyataan SQL. Dengan cara ini, Python 3 digunakan untuk menjalankan pekerjaan.

  • Deskripsi Masalah 2: Saat memanggil UDF MaxCompute di mana get_cache_archive('xxx.zip') dikonfigurasi, salah satu kesalahan berikut dilaporkan: IOError: Unduh sumber daya: xxx.zip gagal, odps.distcache.DistributedCacheError, dan fuxi job failed: Download resource failed: xxx.zip.

    • Penyebab Potensial:

      • Penyebab 1: Paket terkompresi tidak ada. Saat mendaftarkan UDF MaxCompute, Anda tidak menentukan paket terkompresi dalam perintah.

      • Penyebab 2: Jenis sumber daya paket terkompresi bukan ARCHIVE.

      • Penyebab 3: Nama paket atau ekstensi nama file dalam kode tidak sesuai dengan nama paket atau ekstensi nama file sebenarnya. Sebagai contoh, xxx.zip ditentukan dalam kode tetapi file yang diunggah adalah xxx.tar.gz. Dalam hal ini, paket tersebut didekompresi dalam format ZIP. Akibatnya, dekompresi gagal dan kesalahan dilaporkan.

      • Penyebab 4: Dua UDF yang berada dalam pekerjaan yang sama bergantung pada sumber daya yang memiliki nama yang sama. Namun, sumber daya tersebut ada di proyek yang berbeda.

    • Solusi:

      • Solusi 1: Pada Klien MaxCompute, jalankan perintah desc function <function_name>;. Periksa apakah nilai parameter Resources dalam output perintah berisi nama paket terkompresi dalam pesan kesalahan.

        Jika nama paket terkompresi tidak ada, jalankan perintah create function <function_name> as <'package_to_class'> using <'resource_list'>; untuk mendaftarkan UDF MaxCompute lagi. Tambahkan nama paket terkompresi ke parameter resource_list dalam perintah.

        Untuk informasi lebih lanjut tentang cara mendaftarkan fungsi, lihat Buat UDF.

      • Solusi 2: Pada Klien MaxCompute, jalankan perintah desc resource <resource_name>;. Periksa apakah nilai parameter Type dalam output perintah adalah ARCHIVE.

        Jika nilai parameter Type bukan ARCHIVE, jalankan perintah add archive <file_name>; untuk mengunggah paket terkompresi lagi.

        Untuk informasi lebih lanjut tentang cara mengunggah sumber daya, lihat Tambahkan Sumber Daya.

      • Solusi 3: Pada Klien MaxCompute, jalankan perintah desc function <function_name>;. Periksa apakah nama paket dan ekstensi nama file dalam nilai parameter Resources dalam output perintah sesuai dengan nama paket dan ekstensi nama file sebenarnya.

        Jika nama paket atau ekstensi nama file dalam output perintah tidak sesuai dengan nama paket atau ekstensi nama file sebenarnya, jalankan perintah add archive <file_name>; untuk mengunggah paket terkompresi lagi. Atur parameter file_name ke nilai yang sesuai dengan nama paket dan ekstensi nama file sebenarnya.

      • Solusi 4: Selidiki semua UDF yang bergantung pada pekerjaan tersebut, termasuk UDF yang bergantung pada tampilan. Periksa proyek tempat UDF tersebut berada dan sumber daya yang sesuai dengan UDF tersebut. Jika sumber daya yang memiliki nama yang sama ada di proyek yang berbeda, kami sarankan Anda memodifikasi UDF yang bergantung pada pekerjaan tersebut atau memodifikasi nama sumber daya.

  • Deskripsi Masalah 3: Saat memanggil UDF MaxCompute di mana get_cache_table(table_name) dikonfigurasi, pesan kesalahan berikut dilaporkan: odps.distcache.DistributedCacheError: Sumber daya tabel "xxx_table_name" tidak ditemukan.

    • Penyebab Potensial:

      • Penyebab 1: Tabel tidak ada. Saat mendaftarkan UDF MaxCompute, Anda tidak menentukan tabel dalam perintah.

      • Penyebab 2: Jenis sumber daya tabel bukan TABLE.

    • Solusi:

      • Solusi 1: Pada Klien MaxCompute, jalankan perintah desc function <function_name>;. Periksa apakah nilai parameter Resources dalam output perintah berisi nama tabel dalam pesan kesalahan.

        Jika nama tabel tidak ada, jalankan perintah create function <function_name> as <'package_to_class'> using <'resource_list'>; untuk mendaftarkan UDF MaxCompute lagi. Tambahkan nama tabel ke parameter resource_list dalam perintah.

        Untuk informasi lebih lanjut tentang cara mendaftarkan fungsi, lihat Buat UDF.

      • Solusi 2: Pada Klien MaxCompute, jalankan perintah desc resource <resource_name>;. Periksa apakah nilai parameter Type dalam output perintah adalah TABLE.

        Jika nilai parameter Type bukan TABLE, jalankan perintah add table <table_name>; untuk mengunggah tabel lagi.

        Untuk informasi lebih lanjut tentang cara mengunggah sumber daya, lihat Tambahkan Sumber Daya.

  • Deskripsi Masalah 4: Saat memanggil UDF MaxCompute yang merujuk pada paket pihak ketiga, pesan kesalahan berikut dilaporkan: ImportError: Tidak ada modul bernama 'xxx'.

    • Penyebab Potensial:

      • Penyebab 1: Jenis sumber daya paket pihak ketiga bukan ARCHIVE.

      • Penyebab 2: Saat mendaftarkan UDF MaxCompute, Anda tidak menentukan paket pihak ketiga dalam perintah.

      • Penyebab 3: Anda tidak menentukan jalur paket pihak ketiga dalam kode UDF MaxCompute.

      • Penyebab 4: Paket pihak ketiga adalah file WHEEL tetapi ekstensi nama filenya tidak valid. Anda harus mengunduh file WHEEL berdasarkan versi Python.

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

      • Penyebab 6: Nama file Python untuk UDF MaxCompute bertentangan dengan nama modul pihak ketiga yang dirujuk oleh UDF MaxCompute. Sebagai contoh, jika file Python untuk UDF MaxCompute adalah A.py, "import A" dalam kode mengimpor file A.py daripada modul dalam paket pihak ketiga.

    • Solusi:

      • Solusi 1: Pada Klien MaxCompute, jalankan perintah desc resource <resource_name>;. Periksa apakah nilai parameter Type dalam output perintah adalah ARCHIVE.

        Jika nilai parameter Type bukan ARCHIVE, jalankan perintah add archive <file_name>; untuk mengunggah paket terkompresi lagi.

        Untuk informasi lebih lanjut tentang cara mengunggah sumber daya, lihat Tambahkan Sumber Daya.

      • Solusi 2: Pada Klien MaxCompute, jalankan perintah desc function <function_name>;. Periksa apakah nilai parameter Resources dalam output perintah berisi nama paket pihak ketiga dalam pesan kesalahan.

        Jika nama paket pihak ketiga tidak ada, jalankan perintah create function <function_name> as <'package_to_class'> using <'resource_list'>; untuk mendaftarkan UDF MaxCompute lagi. Tambahkan nama paket pihak ketiga ke parameter resource_list dalam perintah.

        Untuk informasi lebih lanjut tentang cara mendaftarkan fungsi, lihat Buat UDF.

      • Solusi 3: Periksa apakah jalur paket pihak ketiga dikonfigurasi dalam sys.path.insert(0, 'work/third-party package path') dalam kode UDF MaxCompute. Sebagai contoh, nama modul adalah A dan file Python adalah A.py. Contoh berikut menunjukkan cara menentukan jalur yang perlu Anda konfigurasikan dalam kode:

        • Contoh 1: File Python berada di folder resource_dir, dan folder ini dikompresi menjadi paket resource-of-A.zip. Jalur yang perlu Anda konfigurasikan dalam sys.path.insert adalah work/resource-of-A.zip/resource_dir/.

        • Contoh 2: File Python berada di folder resource_dir, dan semua file dalam folder ini dikompresi menjadi paket resource-of-A.zip. Jalur yang perlu Anda konfigurasikan dalam sys.path.insert adalah work/resource-of-A.zip/.

        • Contoh 3: File Python berada di folder resource_dir/path1/path2 dan semua file dalam folder resource_dir dikompresi menjadi paket resource-of-A.zip. Jalur yang perlu Anda konfigurasikan dalam sys.path.insert adalah work/resource-of-A.zip/path1/path2/.

        Catatan

        Secara default, sumber daya jenis ARCHIVE ditempatkan di jalur relatif ./work/ dari jalur eksekusi UDF MaxCompute.

      • Solusi 4: File WHEEL bervariasi berdasarkan versi Python. Jika Anda menggunakan Python 2, Anda harus mengunduh file WHEEL yang namanya berisi cp27-cp27m-manylinux1_x86_64. Jika Anda menggunakan Python 3, Anda harus mengunduh file WHEEL yang namanya berisi cp37-cp37m-manylinux1_x86_64. Anda dapat mengubah ekstensi nama file file WHEEL yang diunduh menjadi .zip. Dengan cara ini, Anda tidak perlu mengemas file WHEEL ke dalam file ZIP.

      • Solusi 5: Dalam lingkungan Python yang kompatibel dengan MaxCompute, kompilasi file setup.py menjadi file WHEEL. Kemudian, unggah sumber daya dan daftarkan UDF MaxCompute. Untuk informasi lebih lanjut tentang cara mengkompilasi paket pihak ketiga, lihat Referensi Paket Pihak Ketiga yang Perlu Dikompilasi.

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

  • Deskripsi Masalah 5: Saat memanggil UDF MaxCompute yang merujuk pada pustaka standar Python 3, pesan kesalahan berikut dilaporkan: ImportError: Tidak ada modul bernama enum.

    • Penyebab: Python 3 tidak diaktifkan untuk proyek MaxCompute. Secara default, Python 2 digunakan untuk memanggil UDF MaxCompute. Oleh karena itu, pustaka standar Python 3 tidak dapat diidentifikasi.

    • Solusi: Tambahkan perintah set odps.sql.python.version=cp37; sebelum pernyataan SQL yang digunakan untuk memanggil UDF MaxCompute dan kirimkan perintah bersama dengan pernyataan SQL.

  • Deskripsi Masalah 6: Saat memanggil UDF MaxCompute, pesan kesalahan berikut dilaporkan: ModuleNotFoundError: Tidak ada modul bernama 'six'.

    • Penyebab: Saat menggunakan paket pihak ketiga bersama dengan UDF Python, jalur paket tersebut tidak ditambahkan ke sys.path. Akibatnya, paket pihak ketiga tidak dapat diimpor.

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

  • Deskripsi Masalah 7: Saat memanggil UDF MaxCompute, pesan kesalahan berikut dilaporkan: failed to get Udf info from xxx.py.

    • Penyebab: Dalam kode fungsi tabel yang ditentukan pengguna (UDTF) atau fungsi agregat yang ditentukan pengguna (UDAF), pernyataan yang digunakan untuk mengimpor kelas dasar tidak valid. Sebagai contoh, jika Anda menggunakan import odps.udf.BaseUDTF atau import odps.udf.BaseUDAF, pesan kesalahan akan dilaporkan.

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

Kinerja

  • Deskripsi Masalah: Saat memanggil UDF MaxCompute, pesan kesalahan berikut dilaporkan: kInstanceMonitorTimeout.

  • Penyebab: Pemrosesan data UDF MaxCompute waktu habis. Secara default, durasi pemrosesan data oleh UDF dibatasi. Dalam sebagian besar kasus, UDF harus memproses 1024 baris data sekaligus dalam 1800 detik. Durasi ini bukan total durasi pekerja berjalan tetapi durasi pemrosesan sekelompok kecil catatan data sekaligus. Dalam sebagian besar kasus, SQL MaxCompute dapat memproses lebih dari 10.000 baris data per detik. Batasan ini hanya bertujuan untuk mencegah loop tak terbatas dalam UDF MaxCompute. Jika loop tak terbatas terjadi, sumber daya CPU akan ditempati untuk waktu yang lama.

  • Solusi:

    • Tambahkan informasi logging ke kode UDF MaxCompute. Dengan cara ini, Anda dapat melihat log untuk memeriksa apakah loop tak terbatas terjadi. Anda juga dapat memeriksa apakah durasi pemrosesan satu rekaman oleh UDF MaxCompute sesuai dengan harapan Anda berdasarkan informasi waktu yang dicatat dalam log. Tambahkan informasi logging berikut ke kode. Setelah pekerjaan Anda berjalan, Anda dapat melihat log dalam StdOut dari Antarmuka Pengguna Logview.

      • Python 2

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

        print('log Anda', flush=True)
    • Jika jumlah data besar, UDF MaxCompute mungkin berjalan untuk waktu yang lama. Anda dapat menyesuaikan parameter berikut untuk mencegah kesalahan waktu habis.

      Parameter

      Deskripsi

      set odps.function.timeout=xxx;

      Durasi waktu habis untuk UDF MaxCompute. Nilai default: 1800 detik. Anda dapat mengatur parameter ini ke nilai yang lebih besar berdasarkan kebutuhan bisnis Anda. Nilai valid: 1 detik hingga 3600 detik.

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

      Jumlah baris data yang diproses oleh UDF MaxCompute sekaligus. Nilai default: 1024. Anda dapat mengatur parameter ini ke nilai yang lebih kecil berdasarkan kebutuhan bisnis Anda.

Jaringan

  • Deskripsi Masalah: Saat memanggil UDF MaxCompute untuk mengakses Internet, sebuah kesalahan dilaporkan.

  • Penyebab: UDF MaxCompute tidak mendukung akses ke Internet.

  • Solusi: Isi dan kirimkan formulir aplikasi koneksi jaringan berdasarkan kebutuhan bisnis Anda. Tim dukungan teknis MaxCompute kemudian akan menghubungi Anda untuk menetapkan koneksi jaringan. Untuk informasi lebih lanjut tentang cara mengisi formulir aplikasi, lihat Proses Koneksi Jaringan.

Sandbox

  • Deskripsi Masalah: Saat memanggil UDF MaxCompute, pesan kesalahan berikut dilaporkan: RuntimeError: xxx telah diblokir oleh sandbox.

  • Penyebab: Beberapa panggilan ke UDF Python diblokir oleh sandbox.

  • Solusi:

    • Tambahkan perintah set odps.isolation.session.enable=true; sebelum pernyataan SQL yang digunakan untuk memanggil UDF Python dan kirimkan perintah bersama dengan pernyataan SQL.

    • Secara default, odps.isolation.session.enable diatur ke true untuk UDF Python 3.

Pengkodean

Masalah pengkodean berikut mungkin terjadi:

  • Deskripsi Masalah 1: Saat memanggil UDF MaxCompute, pesan kesalahan berikut dilaporkan: SyntaxError: Karakter Non-ASCII '\xe8' dalam file xxx. pada baris yyy.

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

    • Solusi:

      • Tambahkan perintah set odps.sql.python.version=cp37; sebelum pernyataan SQL yang digunakan untuk memanggil UDF MaxCompute dan kirimkan perintah bersama dengan pernyataan SQL. Dengan cara ini, Python 3 digunakan untuk menjalankan pekerjaan.

      • Tambahkan informasi berikut ke awal file Python. Dengan cara ini, format pengkodean default Python 2 diubah menjadi UTF-8.

        import sys
        reload(sys)
        sys.setdefaultencoding('utf-8')
  • Deskripsi Masalah 2: Saat memanggil UDF MaxCompute yang ditulis dalam Python 2, pesan kesalahan berikut dilaporkan: UnicodeEncodeError: 'ascii' code can't encode characters in position x-y: ordinal not in range(128).

    • Penyebab: Jenis nilai kembali yang ditentukan dalam tanda tangan fungsi adalah STRING. Namun, UDF MaxCompute mengembalikan objek Python bertipe UNICODE. Sebagai contoh, jika objek Python tersebut bernama ret, MaxCompute menggunakan str(ret) untuk mengonversi nilai kembali ret menjadi nilai bertipe STR. Jika ret berada dalam rentang pengkodean ASCII, ia dapat dikonversi menjadi tipe STR. Namun, jika ret tidak berada dalam rentang pengkodean ASCII, konversi gagal dan kesalahan dilaporkan.

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

      return ret.encode('utf-8')
  • Deskripsi Masalah 3: Saat memanggil UDF MaxCompute yang ditulis dalam Python 3, pesan kesalahan berikut dilaporkan: UnicodeDecodeError: 'utf-8' codec can't decode byte xxx in position xxx: invalid continuation byte.

    • Penyebab: Jenis parameter input yang ditentukan dalam tanda tangan fungsi adalah STRING. Namun, string yang dimasukkan saat Anda memanggil UDF Python 3 tidak dapat didekode dalam format UTF-8 menjadi objek Python bertipe STR.

    • Solusi:

      • Jangan tulis string yang dikodekan dalam format selain UTF-8 ke tabel MaxCompute.

        UDF Python 2 mengembalikan objek Python berbasis GBK yang bertipe STR. Objek Python tersebut dapat ditulis secara normal ke tabel MaxCompute tetapi tidak dapat dibaca oleh UDF Python 3. Oleh karena itu, kami sarankan agar objek Python tersebut dikodekan dalam format UTF-8 sebelum dikembalikan oleh UDF Python 2. Sebagai contoh, ret.decode('gbk').encode('utf-8') dapat digunakan untuk mengkodekan objek Python ret.

      • Gunakan fungsi bawaan is_encoding dalam pernyataan SQL untuk menyaring data yang dikodekan dalam format selain UTF-8. Contoh pernyataan:

        select py_udf(input_col) from example_table where is_encoding(input_col, 'utf-8', 'utf-8') = true;
      • Ubah jenis parameter input yang ditentukan dalam tanda tangan fungsi kode Python menjadi BINARY. Kemudian, ubah tipe data kolom yang bertipe STRING menjadi tipe BINARY dalam pernyataan SQL dan gunakan kolom tersebut sebagai parameter input UDF Python 3. Contoh pernyataan:

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

Tanda tangan fungsi

Masalah tanda tangan fungsi berikut mungkin terjadi:

  • Deskripsi Masalah 1: Saat memanggil UDF MaxCompute, pesan kesalahan berikut dilaporkan: resolve annotation of class xxx for UDTF/UDF/UDAF yyy contains invalid content '<EOF>'.

    • Penyebab: Parameter input atau output UDF MaxCompute adalah tipe data kompleks, dan informasi terkait dalam tanda tangan fungsi tidak valid.

    • Solusi: Modifikasi informasi tentang tipe data kompleks dalam tanda tangan fungsi untuk memastikan bahwa tanda tangan fungsi valid. Untuk informasi lebih lanjut tentang tanda tangan fungsi, lihat Tanda Tangan Fungsi dan Tipe Data.

  • Deskripsi Masalah 2: Saat memanggil UDF MaxCompute, pesan kesalahan berikut dilaporkan: TypeError: expected <class 'xxx'> but <class 'yyy'> found, value:zzz.

    • Penyebab: Jenis nilai kembali yang ditentukan dalam tanda tangan fungsi tidak sesuai dengan tipe data dari data yang dikembalikan oleh UDF MaxCompute.

    • Solusi: Konfirmasikan tipe data yang diharapkan dan modifikasi tanda tangan fungsi atau kode UDF MaxCompute untuk memastikan konsistensi.

  • Deskripsi Masalah 3: Saat memanggil UDF MaxCompute, pesan kesalahan berikut dilaporkan: Semantic analysis exception - evaluate function in class xxx.yyy for user defined function zz does not match annotation ***->***.

    • Penyebab: Jumlah parameter input yang ditentukan dalam tanda tangan fungsi tidak sesuai dengan jumlah parameter input untuk metode terkait dalam kode UDF MaxCompute.

    • Solusi: Konfirmasikan jumlah parameter input sebenarnya dan modifikasi tanda tangan fungsi atau kode UDF MaxCompute untuk memastikan konsistensi.

Paket pihak ketiga

  • Deskripsi Masalah: Saat memanggil UDF MaxCompute, pesan kesalahan berikut dilaporkan: GLIBCXX_x.x.x not found.

  • Penyebab: Versi GLIBCXX tempat file pustaka .so bergantung lebih baru daripada versi yang didukung oleh MaxCompute. Masalah serupa mungkin terjadi pada versi glibc dan CXXABI.

  • Solusi: Gunakan paket wheel yang kompatibel atau kompilasi ulang file pustaka .so dalam lingkungan yang kompatibel dengan MaxCompute. MaxCompute mendukung versi terbaru berikut tempat file biner yang dapat dieksekusi atau file pustaka .so bergantung:

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

UDTF

  • Deskripsi Masalah: Saat memanggil UDTF MaxCompute, pesan kesalahan berikut dilaporkan: Semantic analysis exception - expect 2 aliases but have 0.

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

  • Solusi: Gunakan klausa AS untuk menentukan nama kolom dalam pernyataan SELECT yang digunakan untuk memanggil UDTF Python. Contoh pernyataan:

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

UDAF

  • Deskripsi Masalah 1: Saat memanggil UDAF MaxCompute, pesan kesalahan berikut dilaporkan: Script exception - ValueError: unmarshallable object.

    • Penyebab: Nilai parameter buffer dalam kode UDAF Python adalah objek yang tidak dapat di-marshall. Untuk informasi lebih lanjut, lihat Marshal.

    • Solusi: Saat memberi nilai ke buffer, pastikan nilainya adalah objek yang dapat di-marshall. Jika Anda ingin menggunakan dua buffers yang bertipe LIST dan DICT dalam UDAF Python, Anda harus menggunakan return [list(), dict()] dalam metode new_buffer. Saat menggunakan buffer or pbuffer dalam metode iterate, merge, or terminate, buffer bertipe LIST sesuai dengan buffer[0] or pbuffer[0], dan buffer bertipe DICT sesuai dengan buffer[1] or pbuffer[1]. Jika elemen buffer bertipe LIST atau DICT, elemen tersebut juga harus merupakan objek yang dapat di-marshall.

  • Deskripsi Masalah 2: Saat memanggil UDAF MaxCompute, pesan kesalahan berikut dilaporkan: Python UDAF buffer size overflowed: 2821486749.

    • Penyebab: Ukuran buffer dalam kode UDAF Python melebihi 2 GB setelah operasi marshaling. Ukuran buffer diproses dengan cara yang salah. Akibatnya, ukuran buffer meningkat seiring dengan jumlah data.

    • Solusi: Tulis ulang logika kode UDAF Python. Dengan cara ini, ukuran buffer tidak meningkat seiring dengan jumlah data. Sebagai contoh, jika buffer adalah list, data tidak dapat ditambahkan ke buffer dalam fase iteration dan merging. Untuk informasi lebih lanjut tentang UDAF Python, lihat Ikhtisar.