Fungsi agregat yang didefinisikan pengguna (UDAF) bekerja seperti fungsi agregat bawaan, misalnya SUM atau AVG, tetapi Anda yang menentukan logika agregasinya. MaxCompute menjalankan UDAF Python 2 menggunakan Python 2.7.
Gunakan MaxCompute Studio untuk menulis dan mengunggah kode UDAF.
Struktur kode
Berkas UDAF Python 2 terdiri dari lima komponen:
| Component | Required | Description |
|---|---|---|
| Deklarasi encoding | Opsional | Tambahkan #coding:utf-8 atau # -*- coding: utf-8 -*- di bagian atas berkas jika kode berisi karakter Tionghoa. Tanpa deklarasi ini, UDAF akan mengembalikan error saat waktu proses. |
| Impor modul | Wajib | Impor from odps.udf import annotate dan from odps.udf import BaseUDAF. Untuk mereferensikan resource file atau tabel, impor juga from odps.distcache import get_cache_file atau from odps.distcache import get_cache_table. |
| Signature fungsi | Wajib | Deklarasikan tipe data input dan return menggunakan @annotate(<signature>). MaxCompute memvalidasi konsistensi tipe selama penguraian semantik. |
| Kelas Python kustom | Wajib | Perluas BaseUDAF untuk menentukan logika agregasi. |
| Metode | Wajib | Implementasikan keempat metode yang dijelaskan di Metode. |
Metode
Keempat metode wajib diimplementasikan dalam kelas yang memperluas BaseUDAF.
| Method | Required | Description |
|---|---|---|
BaseUDAF.new_buffer() |
Wajib | Mengembalikan nilai antara buffer. buffer harus berupa objek yang dapat dimarshal (marshallable), seperti LIST atau DICT. Ukurannya tidak boleh bertambah seiring dengan jumlah data masukan. Setelah dimarshal, ukuran buffer tidak boleh melebihi 2 MB. |
BaseUDAF.iterate(buffer[, args, ...]) |
Wajib | Mengagregasi args dari setiap baris input ke dalam buffer. |
BaseUDAF.merge(buffer, pbuffer) |
Wajib | Menggabungkan pbuffer ke dalam buffer. MaxCompute memanggil metode ini saat menggabungkan hasil parsial dari berbagai worker. |
BaseUDAF.terminate(buffer) |
Wajib | Mengonversi buffer akhir menjadi nilai tipe data dasar MaxCompute SQL dan mengembalikannya. |
Contoh: menghitung rata-rata
UDAF berikut menghitung rata-rata kolom DOUBLE dan mengembalikan hasil bertipe DOUBLE.
#coding:utf-8
from odps.udf import annotate
from odps.udf import BaseUDAF
@annotate('double->double')
class Average(BaseUDAF):
def new_buffer(self):
# Buffer menyimpan [sum, count] sebagai list
return [0, 0]
def iterate(self, buffer, number):
if number is not None:
buffer[0] += number
buffer[1] += 1
def merge(self, buffer, pbuffer):
buffer[0] += pbuffer[0]
buffer[1] += pbuffer[1]
def terminate(self, buffer):
if buffer[1] == 0:
return 0.0
return buffer[0] / buffer[1]
Setelah mengunggah dan mendaftarkan UDAF (misalnya sebagai my_avg), panggil fungsi tersebut dalam MaxCompute SQL sebagaimana memanggil fungsi agregat bawaan:
-- Menghitung skor rata-rata per kategori
SELECT category, my_avg(score) AS avg_score
FROM my_table
GROUP BY category;
Untuk pemanggilan lintas proyek, tambahkan awalan nama proyek pada fungsi:
SELECT B:my_avg(score) AS avg_score FROM my_table;
Untuk proses pengembangan dan pendaftaran lengkap, lihat Develop a Python UDF.
Signature fungsi dan tipe data
Format tanda tangan
@annotate('<arg_type_list> -> <return_type>')
-
arg_type_list: daftar tipe input yang dipisahkan koma. Gunakan*untuk jumlah input apa pun, atau kosongkan jika tidak ada input. -
return_type: satu tipe return. UDAF selalu mengembalikan satu kolom.
Tipe input yang didukung: BIGINT, STRING, DOUBLE, BOOLEAN, DATETIME, DECIMAL, FLOAT, BINARY, DATE, DECIMAL(precision,scale), CHAR, VARCHAR, ARRAY, MAP, STRUCT, dan tipe kompleks bersarang.
Tipe return yang didukung: BIGINT, STRING, DOUBLE, BOOLEAN, DATETIME, DECIMAL, FLOAT, BINARY, DATE, DECIMAL(precision,scale), ARRAY, MAP, STRUCT, dan tipe kompleks bersarang.
Contoh:
| Signature | Meaning |
|---|---|
@annotate('bigint,double->string') |
Menerima input BIGINT dan DOUBLE, mengembalikan STRING |
@annotate('*->string') |
Menerima sejumlah input apa pun, mengembalikan STRING |
@annotate('->double') |
Tidak menerima input, mengembalikan DOUBLE |
@annotate('array<bigint>->struct<x:string, y:int>') |
Menerima ARRAY<BIGINT>, mengembalikan STRUCT<x:STRING, y:INT> |
Pemetaan tipe data
Tulis logika UDAF menggunakan tipe Python 2 yang sesuai untuk setiap tipe MaxCompute SQL.
| MaxCompute SQL type | Python 2 type |
|---|---|
| BIGINT | INT |
| STRING | STR |
| DOUBLE | FLOAT |
| BOOLEAN | BOOL |
| DATETIME | INT |
| FLOAT | FLOAT |
| CHAR | STR |
| VARCHAR | STR |
| BINARY | BYTEARRAY |
| DATE | INT |
| DECIMAL | DECIMAL.DECIMAL |
| ARRAY | LIST |
| MAP | DICT |
| STRUCT | COLLECTIONS.NAMEDTUPLE |
- DATETIME dipetakan ke INT mengikuti format Stempel waktu UNIX: milidetik yang telah berlalu sejak 1970-01-01 00:00:00 UTC. Gunakan modul
datetimePython untuk memproses nilai DATETIME. - NULL dalam MaxCompute SQL dipetakan ke
Nonedalam Python 2. odps.udf.int(value, silent=True)mengembalikanNonealih-alih memunculkan error ketikavaluetidak dapat dikonversi ke INT.
Batasan
MaxCompute menjalankan kode UDAF dalam lingkungan sandbox. Operasi berikut tidak diizinkan:
-
Membaca dari atau menulis ke file lokal
-
Menjalankan subprocess
-
Menjalankan thread
-
Menggunakan komunikasi socket
-
Memanggil user-defined function (UDF) Python 2 dari sistem lain
Unggah hanya kode yang menggunakan library standar Python. Jika modul library standar atau modul ekstensi C melakukan salah satu operasi di atas, modul tersebut tidak dapat digunakan.
Modul yang tersedia:
-
Semua modul library standar Python murni (tanpa dependensi ekstensi C) tersedia.
-
Modul ekstensi C berikut tersedia:
array,audioop,binascii,bisect,cmath,_codecs_cn,_codecs_hk,_codecs_iso2022,_codecs_jp,_codecs_kr,_codecs_tw,_collections,cStringIO,datetime,_functools,future_builtins,_heapq,_hashlib,itertools,_json,_locale,_lsprof,math,_md5,_multibytecodec,operator,_random,_sha256,_sha512,_sha,_struct,strop,time,unicodedata,_weakref,cPickle.
Batas output: Menulis ke sys.stdout atau sys.stderr dibatasi hingga 20 KB. Karakter yang melebihi batas tersebut akan diabaikan tanpa pemberitahuan.
Library pihak ketiga
Library pihak ketiga, seperti NumPy, telah dipra-instal di lingkungan Python 2 MaxCompute sebagai pelengkap library standar.
Resource referensi
Akses file dan tabel yang didaftarkan sebagai resource MaxCompute dari dalam kode UDAF menggunakan modul odps.distcache.
odps.distcache.get_cache_file(resource_name)
Mengembalikan objek mirip file untuk resource file yang ditentukan.
-
resource_nameharus merupakan nama resource file yang sudah ada di proyek MaxCompute Anda. Nama yang tidak valid atau file yang tidak ada akan menyebabkan error. -
Deklarasikan file tersebut saat membuat UDAF. Pemanggilan tanpa mendeklarasikan resource akan menghasilkan error.
-
Panggil
close()pada objek yang dikembalikan setelah selesai menggunakannya untuk melepaskan resource.
odps.distcache.get_cache_table(resource_name)
Mengembalikan generator yang menghasilkan satu catatan bertipe ARRAY per iterasi untuk resource tabel yang ditentukan.
-
resource_nameharus merupakan nama resource tabel yang sudah ada di proyek MaxCompute Anda. Nama yang tidak valid atau tabel yang tidak ada akan menyebabkan error.
Untuk contoh penggunaan, lihat Reference resources (Python 2 UDFs) dan Reference resources (Python 2 UDTFs).
Langkah selanjutnya
-
Develop a Python UDF — panduan langkah demi langkah untuk menulis, mengunggah, dan menguji UDAF menggunakan MaxCompute Studio
-
Built-in functions — referensi fungsi agregat bawaan yang dapat dilengkapi atau digantikan oleh UDAF
-
Cross-project resource access based on packages — siapkan berbagi UDAF lintas proyek
-
Data type editions — pahami tipe data yang tersedia di proyek Anda