MaxCompute mendukung pengembangan user-defined function (UDF) dalam Python 3 untuk mengimplementasikan logika bisnis kustom.
Struktur kode UDF
Anda dapat menggunakan MaxCompute Studio untuk menulis UDF dalam Python 3. Kode tersebut harus mencakup komponen-komponen berikut:
Impor modul: wajib.
Kode UDF harus menyertakan
from odps.udf import annotateuntuk mengimpor signature fungsi sehingga MaxCompute dapat mengenali signature yang didefinisikan dalam kode. Jika Anda ingin mereferensikan file atau tabel dalam kode UDF, sertakan jugafrom odps.distcache import get_cache_fileataufrom odps.distcache import get_cache_table.-
Signature fungsi: wajib.
Formatnya adalah
@annotate(<signature>), di manasignaturemendefinisikan tipe data parameter input dan nilai kembali fungsi. Untuk informasi lebih lanjut tentang signature fungsi, lihat Signature fungsi dan tipe data. -
Kelas Python kustom: wajib.
Kelas ini mengorganisasi kode UDF serta mendefinisikan variabel dan metode yang mengimplementasikan logika bisnis Anda. Anda juga dapat mereferensikan pustaka pihak ketiga bawaan atau sumber daya file dan tabel dalam kode Anda. Untuk informasi lebih lanjut, lihat Pustaka pihak ketiga atau Referensi sumber daya.
Metode
evaluate: wajib.Metode
evaluateterdapat dalam kelas Python kustom dan mendefinisikan parameter input serta nilai kembali UDF. Setiap kelas Python hanya boleh memiliki satu metodeevaluate.
Kode berikut memberikan contoh UDF.
# Impor modul signature fungsi.
from odps.udf import annotate
# Definisikan signature fungsi.
@annotate("bigint,bigint->bigint")
# Definisikan kelas Python kustom.
class MyPlus(object):
# Implementasikan metode evaluate.
def evaluate(self, arg0, arg1):
if None in (arg0, arg1):
return None
return arg0 + arg1
Batasan
Akses Internet menggunakan UDF
Secara default, MaxCompute tidak mengizinkan akses Internet melalui UDF. Jika Anda memerlukan akses Internet melalui UDF, lengkapi formulir permohonan koneksi jaringan network connection application form sesuai kebutuhan bisnis Anda dan ajukan permohonan tersebut. Tim dukungan teknis MaxCompute akan segera menghubungi Anda untuk mengaktifkan konektivitas jaringan. Untuk informasi lebih lanjut tentang cara mengisi formulir permohonan koneksi jaringan, lihat Proses koneksi jaringan.
Akses VPC menggunakan UDF
Secara default, MaxCompute tidak mengizinkan akses ke resource di VPC melalui UDF. Untuk mengakses resource di VPC menggunakan UDF, Anda harus membuat koneksi jaringan antara MaxCompute dan VPC tersebut. Untuk informasi lebih lanjut tentang operasi terkait, lihat Akses resource VPC dari UDF.
Baca data tabel menggunakan UDF, UDAF, atau UDTF
Anda tidak dapat menggunakan UDF, UDAF, atau UDTF untuk membaca data dari jenis tabel berikut:
Tabel yang telah menjalani schema evolution
Tabel yang berisi tipe data kompleks
Tabel yang berisi tipe data JSON
Tabel transaksional
Catatan penggunaan
Python 3 tidak kompatibel dengan Python 2, dan keduanya tidak dapat digunakan dalam pernyataan SQL yang sama. Pertimbangkan kompatibilitas sebelum beralih.
Python 2 mencapai akhir masa dukungannya (EOL) pada awal tahun 2020. Kami menyarankan agar Anda memigrasikan proyek Anda berdasarkan jenisnya.
Pengembangan UDF: Alur kerja umum
Pengembangan UDF melibatkan persiapan lingkungan, penulisan kode, pengunggahan dan pendaftaran UDF, lalu pemanggilannya. Bagian-bagian berikut menjelaskan alur kerja ini menggunakan MaxCompute Studio, DataWorks, dan odpscmd.
MaxCompute Studio
-
Prasyarat
Instal MaxCompute Studio dan hubungkan ke proyek MaxCompute sebelum memulai. Untuk informasi lebih lanjut, lihat topik berikut:
-
Tulis kode UDF.
-
Di panel Project, di bawah direktori MaxCompute Studio, klik kanan scripts lalu pilih .
-
Di kotak dialog Create new MaxCompute python class, masukkan nama kelas untuk Name, pilih Python UDF sebagai tipe, lalu klik OK.
-
Tulis kode UDF di editor.
from odps.udf import annotate @annotate("string,bigint->string") class GetUrlChar(object): def evaluate(self, url, n): if n == 0: return "" try: index = url.find(".htm") if index < 0: return "" a = url[:index] index = a.rfind("/") b = a[index + 1:] c = b.split("-") if len(c) < n: return "" return c[-n] except Exception: return "Internal error"CatatanUntuk informasi tentang cara men-debug UDF Python secara lokal, lihat Menguji UDF.
-
-
Unggah dan daftarkan UDF.
Klik kanan program Python target lalu pilih Deploy to server…. Konfigurasikan nama fungsi lalu klik OK. Untuk informasi lebih lanjut, lihat Unggah file dan daftarkan fungsi.
Dalam contoh ini, nama fungsi diatur menjadi UDF_GET_URL_CHAR.
-
Panggil UDF.
Di panel navigasi sebelah kiri, klik Project Explore. Klik kanan proyek MaxCompute target, pilih Open Console, lalu masukkan dan jalankan pernyataan SQL untuk memanggil UDF.
SET odps.sql.python.version=cp37; -- Perintah ini diperlukan untuk mengaktifkan Python 3 untuk UDF. SELECT UDF_GET_URL_CHAR("http://www.taobao.com/a.htm", 1);Hasil berikut dikembalikan:
+-----+ | _c0 | +-----+ | a | +-----+
DataWorks
-
Prasyarat
Aktifkan DataWorks dan asosiasikan dengan proyek MaxCompute sebelum memulai. Untuk informasi lebih lanjut, lihat Hubungkan ke MaxCompute menggunakan DataWorks.
-
Tulis kode UDF.
Anda dapat mengembangkan kode UDF di alat pengembangan Python apa pun lalu memaketkannya. Kode berikut merupakan contohnya.
from odps.udf import annotate @annotate("string,bigint->string") class GetUrlChar(object): def evaluate(self, url, n): if n == 0: return "" try: index = url.find(".htm") if index < 0: return "" a = url[:index] index = a.rfind("/") b = a[index + 1:] c = b.split("-") if len(c) < n: return "" return c[-n] except Exception: return "Internal error" -
Unggah dan daftarkan UDF.
Unggah kode yang telah dipaketkan dan daftarkan UDF di DataWorks. Untuk informasi lebih lanjut, lihat topik berikut:
-
Panggil UDF.
Setelah mendaftarkan UDF, buat node ODPS SQL untuk menulis dan menjalankan pernyataan SQL yang memanggil UDF. Untuk informasi lebih lanjut tentang node ODPS SQL, lihat Kembangkan tugas ODPS SQL. Kode berikut memberikan contoh pernyataan SQL.
SET odps.sql.python.version=cp37; -- Perintah ini diperlukan untuk mengaktifkan Python 3 untuk UDF. SELECT UDF_GET_URL_CHAR("http://www.taobao.com/a.htm", 1);
odpscmd
-
Prasyarat
Unduh dan instal odpscmd, lalu konfigurasikan file konfigurasi untuk menghubungkan ke proyek MaxCompute. Untuk informasi selengkapnya, lihat Menyambungkan menggunakan Klien MaxCompute (odpscmd).
-
Tulis kode UDF.
Anda dapat mengembangkan kode UDF di alat pengembangan Python apa pun lalu memaketkannya. Kode berikut merupakan contohnya.
from odps.udf import annotate @annotate("string,bigint->string") class GetUrlChar(object): def evaluate(self, url, n): if n == 0: return "" try: index = url.find(".htm") if index < 0: return "" a = url[:index] index = a.rfind("/") b = a[index + 1:] c = b.split("-") if len(c) < n: return "" return c[-n] except Exception: return "Internal error" -
Unggah dan daftarkan UDF.
Unggah kode yang telah dipaketkan dan daftarkan UDF menggunakan odpscmd. Untuk informasi lebih lanjut, lihat topik berikut:
-
Panggil UDF.
Setelah mendaftarkan UDF, tulis dan jalankan pernyataan SQL untuk memanggilnya.
SET odps.sql.python.version=cp37; -- Perintah ini diperlukan untuk mengaktifkan Python 3 untuk UDF. SELECT UDF_GET_URL_CHAR("http://www.taobao.com/a.htm", 1);
Instal pustaka NumPy
Lingkungan runtime Python 3 bawaan tidak menyertakan NumPy. Jika UDF Anda memerlukan NumPy, unggah secara manual paket WHEEL. Saat Anda mengunduh paket dari PyPI atau situs mirror, nama file-nya berformat numpy-<version>-cp37-cp37m-manylinux1_x86_64.whl. Untuk informasi lebih lanjut tentang pengunggahan paket, lihat Operasi resource atau Gunakan paket pihak ketiga dalam UDF Python.
Untuk daftar pustaka standar yang didukung Python 3, lihat Pustaka standar Python 3.
Signature fungsi dan tipe data
Format signature fungsi:
@annotate(<signature>)Parameter signature adalah string yang menentukan tipe data parameter input dan nilai kembali. Saat menjalankan UDF, tipe data parameter input dan nilai kembali UDF harus konsisten dengan tipe data yang ditentukan dalam signature fungsi. Konsistensi tipe data diperiksa selama penguraian semantik. Jika tipe data tidak konsisten, error akan dikembalikan. Format signature:
'arg_type_list -> type'Deskripsi parameter:
arg_type_list: menentukan tipe data parameter input. Jika terdapat beberapa parameter input, tipe datanya dipisahkan dengan koma (,). Tipe data berikut didukung: BIGINT, STRING, DOUBLE, BOOLEAN, DATETIME, DECIMAL, FLOAT, BINARY, DATE, DECIMAL(precision,scale), CHAR, dan VARCHAR. Tipe data kompleks seperti ARRAY, MAP, dan STRUCT serta tipe data kompleks bersarang juga didukung.arg_type_listdapat direpresentasikan dengan tanda bintang (*) atau dibiarkan kosong ('').Jika
arg_type_listdirepresentasikan dengan tanda bintang (*), jumlah parameter input acak diperbolehkan.Jika
arg_type_listdibiarkan kosong (''), tidak ada parameter input yang digunakan.
type: menentukan tipe data nilai kembali. Untuk UDF, hanya satu kolom nilai yang dikembalikan. Tipe data berikut didukung: BIGINT, STRING, DOUBLE, BOOLEAN, DATETIME, DECIMAL, FLOAT, BINARY, DATE, dan DECIMAL(precision,scale). Tipe data kompleks seperti ARRAY, MAP, dan STRUCT serta tipe data kompleks bersarang juga didukung.
Saat menulis kode UDF, Anda dapat memilih tipe data berdasarkan edisi tipe data MaxCompute yang digunakan oleh proyek MaxCompute Anda. Untuk informasi lebih lanjut tentang edisi tipe data MaxCompute dan tipe data yang didukung di setiap edisi, lihat Edisi tipe data.
Tabel berikut memberikan contoh signature fungsi yang valid.
Signature fungsi | Deskripsi |
| Tipe data parameter input adalah BIGINT dan DOUBLE, sedangkan tipe data nilai kembali adalah STRING. |
| Jumlah parameter input acak digunakan dan tipe data nilai kembali adalah STRING. |
| Tidak ada parameter input yang digunakan dan tipe data nilai kembali adalah DOUBLE. |
| Tipe data parameter input adalah ARRAY<BIGINT> dan tipe data nilai kembali adalah STRUCT<x:STRING, y:INT>. |
| Tidak ada parameter input yang digunakan dan tipe data nilai kembali adalah MAP<BIGINT, STRING>. |
Tabel berikut menjelaskan pemetaan antara tipe data yang didukung di MaxCompute SQL dan tipe data Python 2. Anda harus menulis UDF Python sesuai dengan pemetaan tersebut untuk memastikan konsistensi tipe data.
|
Tipe MaxCompute SQL |
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 |
Mereferensikan sumber daya
Anda dapat mereferensikan file atau tabel dalam kode UDF Python 2 menggunakan modul odps.distcache.
-
odps.distcache.get_cache_file(resource_name, mode): Mengembalikan konten resource file tertentu dalammodeyang ditentukan.resource_nameadalah string yang menentukan nama tabel yang ada di proyek MaxCompute Anda. Jika nama tabel tidak valid atau tabel tidak ada, error akan dikembalikan.-
Parameter
modeadalah STRING. Nilai default-nya adalah't'. Jika Anda mengaturmodeke't', file dibuka dalam mode teks. Jika Anda mengaturmodeke'b', file dibuka dalam mode biner. Nilai kembalinya adalah objek bertipe file. Jika objek ini tidak lagi digunakan, Anda harus memanggil metode
closeuntuk melepas file yang terbuka.
Kode berikut menunjukkan cara mereferensikan file.
from odps.udf import annotate from odps.distcache import get_cache_file @annotate('bigint->string') class DistCacheExample(object): def __init__(self): cache_file = get_cache_file('test_distcache.txt') kv = {} for line in cache_file: line = line.strip() if not line: continue k, v = line.split() kv[int(k)] = v cache_file.close() self.kv = kv def evaluate(self, arg): return self.kv.get(arg) -
odps.distcache.get_cache_table(resource_name): Mengembalikan konten resource tabel tertentu.-
Parameter
resource_namemenentukan resource tabel yang ada di proyek MaxCompute saat ini. Pengecualian akan dilemparkan jika nama resource tidak valid atau resource tidak ada. Tipe data yang didukung: BIGINT, STRING, DOUBLE, BOOLEAN, DATETIME, FLOAT, CHAR, VARCHAR, BINARY, DATE, DECIMAL, ARRAY, MAP, dan STRUCT. -
Nilai kembalinya adalah Generator. Setiap iterasi menghasilkan satu catatan tabel sebagai array.
-
Kode berikut menunjukkan cara mereferensikan tabel.
from odps.udf import annotate
from odps.distcache import get_cache_table
@annotate('->string')
class DistCacheTableExample(object):
def __init__(self):
self.records = list(get_cache_table('udf_test'))
self.counter = 0
self.ln = len(self.records)
def evaluate(self):
if self.counter > self.ln - 1:
return None
ret = self.records[self.counter]
self.counter += 1
return str(ret)Memanggil UDF
Setelah mengembangkan UDF Python 3 mengikuti alur kerja pengembangan, Anda dapat memanggilnya dalam MaxCompute SQL sebagai berikut:
Aktifkan Python 3
Secara default, MaxCompute menggunakan Python 2. Untuk menggunakan Python 3, sertakan flag sesi berikut dalam pernyataan SQL Anda.
set odps.sql.python.version=cp37;
Panggil fungsi
Gunakan UDF dalam proyek MaxCompute: Caranya mirip dengan penggunaan fungsi bawaan. Anda dapat menggunakan user-defined function dengan cara yang sama seperti menggunakan fungsi bawaan.
Gunakan UDF lintas proyek: Gunakan UDF dari Proyek B di Proyek A. Pernyataan berikut menunjukkan contohnya:
select B:udf_in_other_project(arg0, arg1) as res from table_t;. Untuk informasi lebih lanjut tentang berbagi lintas proyek, lihat Akses resource lintas proyek berbasis paket.
Migrasi UDF Python 2
Python 2 mencapai EOL pada awal tahun 2020. Kami menyarankan agar Anda memigrasikan proyek Anda berdasarkan jenisnya:
-
Proyek baru: Untuk proyek MaxCompute baru atau proyek tempat Anda pertama kali menulis UDF Python, gunakan Python 3 untuk semua UDF Python.
-
Proyek yang sudah ada: Untuk proyek dengan banyak UDF Python 2, berhati-hatilah saat mengaktifkan Python 3. Untuk migrasi bertahap, gunakan metode berikut:
-
Pekerjaan dan UDF baru: Gunakan Python 3 untuk menulis UDF dan aktifkan Python 3 pada tingkat sesi. Untuk informasi lebih lanjut tentang cara mengaktifkan Python 3, lihat Aktifkan Python 3.
-
UDF Python 2: Tulis ulang UDF Python 2 agar kompatibel dengan Python 2 dan Python 3. Untuk informasi lebih lanjut tentang cara menulis ulang UDF, lihat Porting Kode Python 2 ke Python 3.
CatatanJika Anda menulis UDF publik yang dibagikan lintas beberapa proyek MaxCompute, pastikan UDF tersebut kompatibel dengan Python 2 dan Python 3.
-