全部产品
Search
文档中心

MaxCompute:UDTF Python 3

更新时间:Jul 06, 2025

Python Software Foundation telah mengumumkan Akhir Masa Pakai (EOL) untuk Python 2. Oleh karena itu, MaxCompute mendukung Python 3 dengan menggunakan CPython 3.7.3. Topik ini menjelaskan cara menulis kode fungsi tabel bernilai pengguna (UDTF) dalam Python 3.

Struktur kode UDTF

Anda dapat menggunakan MaxCompute Studio untuk menulis kode UDTF dalam Python 3. Kode tersebut mencakup informasi berikut:
  • Impor modul: wajib.

    Kode UDTF harus mencakup from odps.udf import annotate dan from odps.udf import BaseUDTF. from odps.udf import annotate digunakan untuk mengimpor modul tanda tangan fungsi, memungkinkan MaxCompute mengenali tanda tangan fungsi yang didefinisikan dalam kode. from odps.udf import BaseUDTF adalah kelas dasar untuk UDTF Python. Anda harus menggunakan kelas ini untuk mengimplementasikan metode seperti process dan close di kelas turunan.

    Untuk mereferensikan file atau tabel dalam kode UDTF, gunakan from odps.distcache import get_cache_file atau from odps.distcache import get_cache_table.

  • Tanda tangan fungsi: opsional.

    Tanda tangan fungsi berada dalam format @annotate(<signature>). Parameter signature mendefinisikan tipe data parameter input dan nilai balik UDTF. Jika tidak ditentukan, parameter input dari tipe data apa pun dapat cocok saat memanggil UDTF dalam Pernyataan SQL, tetapi tipe data nilai balik tidak dapat disimpulkan dan semua parameter output menjadi tipe STRING. Untuk detail lebih lanjut tentang tanda tangan fungsi, lihat Tanda Tangan Fungsi dan Tipe Data.

  • Kelas Python kustom (kelas turunan): wajib.

    Kelas Python kustom merupakan unit organisasi kode UDTF. Kelas ini mendefinisikan variabel dan metode untuk memenuhi kebutuhan bisnis Anda. Dalam kode UDTF, Anda dapat mereferensikan pustaka pihak ketiga yang dibangun di MaxCompute atau mereferensikan file atau tabel. Untuk informasi lebih lanjut, lihat Pustaka Pihak Ketiga atau Referensi Sumber Daya.

  • Metode untuk mengimplementasikan kelas Python: wajib.

    Empat metode dapat digunakan untuk mengimplementasikan kelas Python. Tabel berikut menjelaskan metode-metode ini.

    MetodeDeskripsi
    BaseUDTF.init()Metode inisialisasi. Untuk mengimplementasikan metode ini untuk kelas turunan, Anda harus memanggil metode inisialisasi super(BaseUDTF, self).init() dari kelas dasar saat Anda mulai menjalankan kode. Metode INIT hanya dipanggil sekali selama siklus hidup UDTF. Metode ini hanya dipanggil sebelum catatan pertama diproses. Jika UDTF perlu menyimpan status internal, semua status dapat diinisialisasi dengan menggunakan metode ini.
    BaseUDTF.process([args, ...])Fungsi process dipanggil sekali untuk setiap catatan SQL. Parameter dari fungsi process adalah parameter input UDTF yang ditentukan dalam Pernyataan SQL.
    BaseUDTF.forward([args, ...])Metode keluaran UDTF. Metode ini dipanggil oleh kode pengguna. Satu catatan keluaran dihasilkan setiap kali metode forward dipanggil. Parameter dalam metode forward adalah parameter keluaran UDTF yang ditentukan dalam Pernyataan SQL.

    Jika tidak ada tanda tangan fungsi yang ditentukan dalam kode Python, semua nilai keluaran harus dikonversi menjadi tipe STRING saat metode forward dipanggil.

    BaseUDTF.close()Metode untuk mengakhiri UDTF. Metode ini hanya dipanggil sekali. Metode ini hanya dipanggil sebelum catatan terakhir diproses.
Berikut adalah contoh kode UDTF.
# Impor modul tanda tangan fungsi dan kelas dasar. 
from odps.udf import annotate
from odps.udf import BaseUDTF
# Tanda tangan fungsi. 
@annotate('string -> string')
# Kelas Python kustom. 
class Explode(BaseUDTF):
# Metode yang digunakan untuk mengimplementasikan kelas Python kustom. 
   def process(self, arg):
       props = arg.split(',')
       for p in props:
           self.forward(p)
Catatan Versi Python yang mendasari UDTF Python 2 dan UDTF Python 3 berbeda. Pastikan Anda menulis UDTF sesuai dengan kemampuan versi Python yang digunakan.

Peringatan

Python 3 tidak kompatibel dengan Python 2. Oleh karena itu, Anda tidak dapat menggunakan kode Python 2 dan Python 3 secara bersamaan dalam satu Pernyataan SQL.

Catatan

Python Software Foundation mengumumkan akhir masa pakai (EOL) untuk Python 2 pada awal tahun 2020. Kami sarankan Anda memindahkan UDF Python 2 ke Python 3. Untuk Proyek MaxCompute yang sudah ada, kami sarankan Anda memindahkan UDF Python 2. Untuk proyek baru, gunakan Python 3 untuk menulis semua UDF Python.

Pindahkan UDTF Python 2

Python Software Foundation mengumumkan EOL untuk Python 2. Oleh karena itu, kami sarankan Anda memindahkan UDTF Python 2. Metode pemindahan bervariasi berdasarkan jenis Proyek MaxCompute.
  • Proyek baru: Jika proyek Anda adalah proyek MaxCompute baru atau Anda menggunakan Python untuk pertama kalinya, gunakan Python 3 untuk menulis semua UDTF Python.
  • Proyek yang sudah ada: Jika proyek Anda memiliki sejumlah besar UDTF Python 2, berhati-hatilah saat mengaktifkan Python 3. Jika Anda berencana untuk mengganti UDTF Python 2 dengan UDTF Python 3 secara bertahap, gunakan salah satu metode berikut:
    • Gunakan Python 3 untuk menulis UDTF baru dan aktifkan Python 3 untuk pekerjaan baru pada tingkat sesi. Untuk informasi lebih lanjut tentang cara mengaktifkan Python 3, lihat Aktifkan Python 3.
    • Tulis ulang UDTF Python 2 agar kompatibel dengan Python 2 dan Python 3. Untuk informasi lebih lanjut tentang cara menulis ulang UDTF, lihat Memindahkan Kode Python 2 ke Python 3.
      Catatan Jika Anda perlu menulis UDTF publik dan memberikan izin kepada beberapa Proyek MaxCompute pada UDTF, pastikan bahwa UDTF kompatibel dengan Python 2 dan Python 3.

Pustaka pihak ketiga

NumPy tidak diinstal dalam lingkungan runtime Python 3 di MaxCompute. Untuk menggunakan UDTF NumPy, unggah paket wheel NumPy secara manual. Jika Anda memperoleh paket wheel NumPy dari Python Package Index (PyPI) atau gambar lainnya, nama file adalah numpy-<Versi>-cp37-cp37m-manylinux1_x86_64.whl. Untuk informasi lebih lanjut tentang cara mengunggah file, lihat Operasi Sumber Daya atau Contoh: Referensi Paket Pihak Ketiga dalam UDF Python.

Tanda tangan fungsi dan tipe data

Format tanda tangan fungsi:
@annotate(<signature>)

signature adalah string tanda tangan fungsi yang digunakan untuk mengidentifikasi tipe data parameter input dan nilai balik. Saat UDTF dijalankan, parameter input dan nilai balik harus memiliki tipe data yang sama dengan yang ditentukan dalam tanda tangan fungsi. Konsistensi tipe data diperiksa selama penguraian semantik. Jika tipe data tidak konsisten, kesalahan akan dikembalikan. Format tanda tangan adalah sebagai berikut:

'arg_type_list -> type_list'

Deskripsi parameter:

  • type_list: menunjukkan tipe data nilai balik. UDTF dapat mengembalikan beberapa kolom. Tipe data yang didukung meliputi BIGINT, STRING, DOUBLE, BOOLEAN, DATETIME, DECIMAL, FLOAT, BINARY, DATE, dan DECIMAL(presisi, skala). Tipe data kompleks seperti ARRAY, MAP, STRUCT, serta tipe data kompleks bersarang juga didukung.

  • arg_type_list: menentukan tipe data parameter input. Jika terdapat beberapa parameter input, tentukan beberapa tipe data dan pisahkan dengan koma (,). Tipe data yang didukung meliputi BIGINT, STRING, DOUBLE, BOOLEAN, DATETIME, DECIMAL, FLOAT, BINARY, DATE, DECIMAL(presisi,skala), CHAR, VARCHAR, tipe data kompleks (ARRAY, MAP, STRUCT), dan tipe data kompleks bersarang.

    arg_type_list dapat direpresentasikan oleh asterisk (*) atau dibiarkan kosong ('').

    • Jika arg_type_list direpresentasikan oleh asterisk (*), jumlah parameter input acak diperbolehkan.

    • Jika arg_type_list dibiarkan kosong (''), tidak ada parameter input yang digunakan.

    Untuk informasi lebih lanjut tentang ekstensi sintaks anotasi @Resolve, lihat Parameter Dinamis UDAF dan UDTF.

Catatan Saat menulis kode UDTF, pilih tipe data berdasarkan edisi tipe data Proyek MaxCompute Anda. Untuk informasi lebih lanjut tentang edisi tipe data dan tipe data yang didukung oleh setiap edisi, lihat Edisi Tipe Data.
Tabel berikut memberikan contoh tanda tangan fungsi yang valid.
Tanda tangan fungsiDeskripsi
@annotate('bigint,boolean->string,datetime')Tipe data dari parameter input adalah BIGINT dan BOOLEAN. Tipe data dari nilai balik adalah STRING dan DATETIME.
@annotate('*->string, datetime')Jumlah parameter input acak digunakan dan tipe data dari nilai balik adalah STRING dan DATETIME.
@annotate('->double, bigint, string')Tidak ada parameter input yang digunakan, dan tipe data dari nilai balik adalah DOUBLE, BIGINT, dan STRING.
@annotate("array<string>,struct<a1:bigint,b1:string>,string->map<string,bigint>,struct<b1:bigint>")Tipe data dari parameter input adalah ARRAY, STRUCT, dan MAP. Tipe data dari nilai balik adalah MAP dan STRUCT.

Tabel berikut menjelaskan pemetaan antara tipe data yang didukung oleh Proyek MaxCompute dan tipe data Python. Tulis UDTF Python berdasarkan pemetaan ini untuk memastikan konsistensi tipe data. Tabel berikut menjelaskan pemetaan tipe data.

Tipe SQL MaxCompute

Tipe Python 3

BIGINT

INT

STRING

UNICODE

DOUBLE

FLOAT

BOOLEAN

BOOL

DATETIME

DATETIME.DATETIME

FLOAT

FLOAT

CHAR

UNICODE

VARCHAR

UNICODE

BINARY

BYTES

DATE

DATETIME.DATE

DECIMAL

DECIMAL.DECIMAL

ARRAY

LIST

MAP

DICT

STRUCT

COLLECTIONS.NAMEDTUPLE

Referensi sumber daya

Anda dapat mereferensikan file dan tabel dalam UDTF Python menggunakan modul odps.distcache.

  • odps.distcache.get_cache_file(resource_name): mengembalikan konten file tertentu.
    • resource_name adalah string yang menentukan nama file yang ada di Proyek MaxCompute Anda. Jika nama file tidak valid atau file tidak ada, kesalahan akan dikembalikan.
      Catatan Untuk mereferensikan file dalam UDTF, deklarasikan sumber daya file saat membuat UDTF. Jika tidak, kesalahan akan dikembalikan saat UDTF dipanggil.
    • Nilai balik adalah objek mirip file. Jika objek ini tidak lagi digunakan, panggil metode close untuk melepaskan file yang terbuka.
  • odps.distcache.get_cache_table(resource_name): mengembalikan konten tabel tertentu.
    • resource_name adalah string yang menentukan nama tabel yang ada di Proyek MaxCompute Anda. Jika nama tabel tidak valid atau tabel tidak ada, kesalahan akan dikembalikan.
    • Nilai balik adalah tipe generator. Pemanggil melintasi tabel untuk mendapatkan konten. Setiap kali pemanggil melintasi tabel, catatan tipe ARRAY dihasilkan.
Berikut adalah kode sampel yang menunjukkan cara mereferensikan file dan tabel.
from odps.udf import annotate
from odps.udf import BaseUDTF
from odps.distcache import get_cache_file
from odps.distcache import get_cache_table
@annotate('string -> string, bigint')
class UDTFExample(BaseUDTF):
    """Baca pageid dan adid_list dari file dan tabel untuk menghasilkan dict.
    """
    def __init__(self):
        import json
        cache_file = get_cache_file('test_json.txt')
        self.my_dict = json.load(cache_file)
        cache_file.close()
        records = list(get_cache_table('table_resource1'))
        for record in records:
            self.my_dict[record[0]] = record[1]
    """Masukkan pageid dan hasilkan pageid dan semua nilai adid.
    """
    def process(self, pageid):
        for adid in self.my_dict[pageid]:
            self.forward(pageid, adid)

Instruksi

Setelah mengembangkan UDTF Python 3 sesuai instruksi dalam Proses Pengembangan, Anda dapat menggunakan MaxCompute SQL untuk memanggil UDTF Python 3. Gunakan salah satu metode berikut untuk memanggil UDTF Python 3:
  • Gunakan UDF dalam Proyek MaxCompute: Metodenya serupa dengan penggunaan fungsi bawaan.

  • Gunakan UDF lintas proyek: Gunakan UDF dari Proyek B di Proyek A. Contohnya adalah sebagai berikut: select B:udf_in_other_project(arg0, arg1) as res from table_t;. Untuk informasi lebih lanjut tentang berbagi lintas proyek, lihat Akses Sumber Daya Lintas Proyek Berdasarkan Paket.

Untuk informasi lebih lanjut tentang cara menggunakan MaxCompute Studio untuk mengembangkan dan memanggil UDTF Python 3, lihat Kembangkan UDF Python.