All Products
Search
Document Center

MaxCompute:UDTF Python 3

Last Updated:Mar 26, 2026

MaxCompute mendukung Python 3 menggunakan CPython 3.7.3. Karena Python 2 telah mencapai akhir masa dukungan (End of Life/EOL), semua user-defined table-valued function (UDTF) baru harus ditulis dalam Python 3.

Aktifkan Python 3

Secara default, proyek MaxCompute menggunakan Python 2 untuk UDF. Untuk menggunakan Python 3, tambahkan perintah tingkat sesi berikut sebelum pernyataan SQL Anda dan kirimkan bersama:

set odps.sql.python.version=cp37;

Struktur kode UDTF

Gunakan MaxCompute Studio untuk menulis kode UDTF dalam Python 3. Sebuah UDTF terdiri dari empat komponen:

KomponenWajibDeskripsi
Impor modulWajibHarus menyertakan from odps.udf import annotate dan from odps.udf import BaseUDTF. Untuk mereferensikan file atau tabel, tambahkan juga from odps.distcache import get_cache_file atau from odps.distcache import get_cache_table.
Signature fungsiOpsionalDideklarasikan dengan @annotate(<signature>). Menentukan tipe data parameter input dan nilai kembali. Tanpa signature, semua tipe data input diterima dan semua nilai kembali dianggap sebagai STRING secara default.
Kelas Python kustomWajibKelas turunan dari BaseUDTF. Mendefinisikan variabel dan metode untuk logika bisnis Anda.
Metode kelasWajibMengimplementasikan metode yang dijelaskan dalam tabel di bawah ini.

Metode kelas

MetodeWajibKapan dipanggilDeskripsi
BaseUDTF.init()OpsionalSekali, sebelum catatan pertamaMetode inisialisasi. Saat meng-override, panggil super(BaseUDTF, self).init() di awal. Gunakan metode ini untuk mengatur status internal yang bertahan antar catatan.
BaseUDTF.process([args, ...])WajibSekali per catatan SQLMemproses setiap baris input. Parameter fungsi process adalah parameter input UDTF yang ditentukan dalam pernyataan SQL.
BaseUDTF.forward([args, ...])WajibDipanggil oleh kode AndaMenghasilkan satu baris per pemanggilan. Parameter dalam metode forward adalah parameter output UDTF yang ditentukan dalam pernyataan SQL. Tanpa signature fungsi, konversi semua nilai ke STRING sebelum memanggil forward.
BaseUDTF.close()OpsionalSekali, sebelum catatan terakhirMetode pembersihan. Gunakan metode ini untuk melepaskan resource saat UDTF dihentikan.

Contoh berikut menunjukkan UDTF minimal yang memisahkan string yang dipisahkan koma menjadi baris-baris individual:

# Impor modul signature fungsi dan kelas dasar.
from odps.udf import annotate
from odps.udf import BaseUDTF

# Signature fungsi: menerima STRING, mengembalikan STRING.
@annotate('string -> string')

# Kelas Python kustom yang diturunkan dari BaseUDTF.
class Explode(BaseUDTF):

    def process(self, arg):
        props = arg.split(',')
        for p in props:
            self.forward(p)
UDTF Python 2 dan UDTF Python 3 dijalankan pada versi Python dasar yang berbeda. Tulis setiap UDTF sesuai dengan sintaksis dan kemampuan versi Python yang dituju.

Batasan

Python 3 tidak kompatibel dengan Python 2. Satu pernyataan SQL tidak dapat mencampur UDTF Python 2 dan UDTF Python 3.

Migrasi UDTF Python 2

Karena Python 2 telah mencapai EOL, migrasikan UDTF Python 2 yang ada sesuai dengan situasi proyek Anda:

  • Proyek baru atau UDTF Python pertama: Tulis semua UDTF Python dalam Python 3 sejak awal.

  • Proyek yang sudah ada dengan banyak UDTF Python 2: Lakukan migrasi secara bertahap untuk menghindari gangguan. Pilih salah satu pendekatan berikut:

    • Tulis UDTF baru dalam Python 3 dan aktifkan Python 3 pada tingkat sesi untuk pekerjaan yang menggunakan UDTF tersebut. Untuk detailnya, lihat Aktifkan Python 3.

    • Tulis ulang UDTF Python 2 yang ada agar kompatibel dengan Python 2 dan Python 3. Lihat panduan Porting Python 2 Code to Python 3.

Jika sebuah UDTF digunakan bersama di beberapa proyek MaxCompute, buatlah kompatibel dengan Python 2 dan Python 3 agar tidak mengganggu proyek yang masih menggunakan Python 2.

Pustaka pihak ketiga

NumPy tidak termasuk dalam lingkungan runtime Python 3 MaxCompute. Untuk menggunakan NumPy dalam UDTF, unggah secara manual paket wheel NumPy sebagai resource. Nama file yang diharapkan dari Python Package Index (PyPI) atau image adalah:

numpy-<Version>-cp37-cp37m-manylinux1_x86_64.whl

Untuk petunjuk mengunggah paket tersebut, lihat Operasi resource atau Referensi paket pihak ketiga dalam UDF Python.

Signature fungsi dan tipe data

Signature fungsi mendeklarasikan tipe data parameter input dan nilai kembali UDTF. MaxCompute memvalidasi signature tersebut selama penguraian semantik dan mengembalikan error jika tipe aktual tidak sesuai.

Format tanda tangan

@annotate('arg_type_list -> type_list')
  • arg_type_list: tipe parameter input yang dipisahkan koma. Atur ke * untuk menerima jumlah parameter apa pun, atau biarkan kosong jika tidak menerima parameter.

  • type_list: tipe nilai kembali. UDTF dapat mengembalikan beberapa kolom.

Tipe yang didukung untuk `type_list`: BIGINT, STRING, DOUBLE, BOOLEAN, DATETIME, DECIMAL, FLOAT, BINARY, DATE, DECIMAL(presisi,skala), serta tipe kompleks (ARRAY, MAP, STRUCT), termasuk tipe kompleks bersarang.

Tipe yang didukung untuk `arg_type_list`: semua tipe yang disebutkan di atas, ditambah CHAR dan VARCHAR.

Pilih tipe data berdasarkan edisi tipe data proyek MaxCompute Anda.

Contoh signature

SignatureDeskripsi
@annotate('bigint,boolean->string,datetime')Dua parameter input (BIGINT, BOOLEAN); dua nilai kembali (STRING, DATETIME).
@annotate('*->string,datetime')Jumlah parameter input apa pun; dua nilai kembali (STRING, DATETIME).
@annotate('->double,bigint,string')Tidak ada parameter input; tiga nilai kembali (DOUBLE, BIGINT, STRING).
@annotate("array<string>,struct<a1:bigint,b1:string>,string->map<string,bigint>,struct<b1:bigint>")Input dan output tipe kompleks.

Pemetaan tipe data

Tulis UDTF Python menggunakan tipe Python yang sesuai dengan tipe SQL MaxCompute:

Tipe SQL MaxComputeTipe Python 3
BIGINTINT
STRINGUNICODE
DOUBLEFLOAT
BOOLEANBOOL
DATETIMEDATETIME.DATETIME
FLOATFLOAT
CHARUNICODE
VARCHARUNICODE
BINARYBYTES
DATEDATETIME.DATE
DECIMALDECIMAL.DECIMAL
ARRAYLIST
MAPDICT
STRUCTCOLLECTIONS.NAMEDTUPLE

Referensi resource

Referensikan file dan tabel dalam UDTF Python menggunakan modul odps.distcache.

`odps.distcache.get_cache_file(resource_name)`

Mengembalikan konten resource file.

  • resource_name: nama resource file yang ada di proyek MaxCompute Anda. Mengembalikan error jika nama tidak valid atau file tidak ada.

  • Mengembalikan objek mirip file. Panggil close() pada objek tersebut setelah selesai untuk melepaskan handle file.

  • Deklarasikan resource file saat membuat UDTF. Jika deklarasi ini dihilangkan, pemanggilan UDTF akan mengembalikan error.

`odps.distcache.get_cache_table(resource_name)`

Mengembalikan konten resource tabel.

  • resource_name: nama resource tabel yang ada di proyek MaxCompute Anda. Mengembalikan error jika nama tidak valid atau tabel tidak ada.

  • Mengembalikan generator. Iterasi menghasilkan satu catatan per baris, di mana setiap catatan berupa ARRAY.

Contoh berikut membaca data dari file JSON dan resource tabel, lalu menghasilkan baris berdasarkan pencarian:

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):

    def __init__(self):
        import json
        # Muat resource file JSON ke dalam dict.
        cache_file = get_cache_file('test_json.txt')
        self.my_dict = json.load(cache_file)
        cache_file.close()

        # Tambahkan catatan dari resource tabel ke dalam dict.
        records = list(get_cache_table('table_resource1'))
        for record in records:
            self.my_dict[record[0]] = record[1]

    def process(self, pageid):
        # Untuk setiap pageid input, forward semua nilai adid yang terkait.
        for adid in self.my_dict[pageid]:
            self.forward(pageid, adid)

Panggil UDTF Python 3

Setelah mengembangkan UDTF Python 3 mengikuti proses pengembangan, panggil UDTF tersebut dari SQL MaxCompute.

  • Dalam satu proyek: Panggil UDTF seperti memanggil fungsi bawaan.

  • Antar proyek: Referensikan UDTF dari proyek lain menggunakan nama proyek sebagai awalan:

    SELECT B:udf_in_other_project(arg0, arg1) AS res FROM table_t;

    Untuk pengaturan berbagi resource antar proyek, lihat Berbagi sumber daya berbasis paket antar proyek.

Untuk mengembangkan dan menguji UDTF Python 3 di MaxCompute Studio, lihat Mengembangkan UDF Python.