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
- Impor modul: wajib.
Kode UDTF harus mencakup
from odps.udf import annotatedanfrom odps.udf import BaseUDTF.from odps.udf import annotatedigunakan untuk mengimpor modul tanda tangan fungsi, memungkinkan MaxCompute mengenali tanda tangan fungsi yang didefinisikan dalam kode.from odps.udf import BaseUDTFadalah kelas dasar untuk UDTF Python. Anda harus menggunakan kelas ini untuk mengimplementasikan metode sepertiprocessdanclosedi kelas turunan.Untuk mereferensikan file atau tabel dalam kode UDTF, gunakan
from odps.distcache import get_cache_fileataufrom odps.distcache import get_cache_table. - Tanda tangan fungsi: opsional.
Tanda tangan fungsi berada dalam format
@annotate(<signature>). Parametersignaturemendefinisikan 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.
Metode Deskripsi 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. MetodeINIThanya 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 processdipanggil sekali untuk setiap catatan SQL. Parameter dari fungsiprocessadalah 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 forwarddipanggil. Parameter dalam metodeforwardadalah 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
forwarddipanggil.BaseUDTF.close()Metode untuk mengakhiri UDTF. Metode ini hanya dipanggil sekali. Metode ini hanya dipanggil sebelum catatan terakhir diproses.
# 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)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.
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
- 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
@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_listdapat direpresentasikan oleh asterisk (*) atau dibiarkan kosong ('').Jika
arg_type_listdirepresentasikan oleh asterisk (*), jumlah parameter input acak diperbolehkan.Jika
arg_type_listdibiarkan kosong (''), tidak ada parameter input yang digunakan.
Untuk informasi lebih lanjut tentang ekstensi sintaks anotasi @Resolve, lihat Parameter Dinamis UDAF dan UDTF.
| Tanda tangan fungsi | Deskripsi |
@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_nameadalah 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
closeuntuk melepaskan file yang terbuka.
odps.distcache.get_cache_table(resource_name): mengembalikan konten tabel tertentu.resource_nameadalah 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.
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
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.