Fungsi agregat yang didefinisikan pengguna (UDAF) memetakan beberapa record input ke satu nilai output. Gunakan UDAF jika tidak tersedia fungsi agregat bawaan yang sesuai dengan logika agregasi Anda. MaxCompute mendukung UDAF yang ditulis dalam Java atau Python.
Kapan menggunakan UDAF
Fungsi bawaan telah dioptimalkan untuk pemrosesan terdistribusi dan menawarkan kinerja lebih baik dibandingkan UDAF. Gunakan fungsi bawaan bila tersedia untuk kasus penggunaan Anda.
Buat UDAF ketika logika agregasi Anda tidak dapat diekspresikan menggunakan fungsi bawaan—misalnya, model statistik kustom, skoring berbasis domain, atau agregasi berbobot multi-field.
Jenis UDAF
| Type | Language | Runtime |
|---|---|---|
| Java UDAF | Java | JVM |
| Python 2 UDAF | Python | Python 2.7 |
| Python 3 UDAF | Python | CPython 3.7.3 |
Untuk detail implementasi, lihat Java UDAFs, Python 2 UDAF, dan Python 3 UDAF.
Proses pengembangan
Java UDAF
Gambar berikut menunjukkan alur kerja pengembangan Java UDAF.

| Step | Required | Description | Platform | References |
|---|---|---|---|---|
| 1 | No | Tambahkan dependensi SDK odps-sdk-udf ke file POM Anda. Contoh: <dependency><groupId>com.aliyun.odps</groupId><artifactId>odps-sdk-udf</artifactId><version>0.29.10-public</version></dependency>. Cari versi terbaru di repositori Maven. | IntelliJ IDEA (Maven) | — |
| 2 | Yes | Tulis UDAF. | IntelliJ IDEA (Maven) dan MaxCompute Studio | Develop a UDF in Java |
| 3 | Yes | Debug UDAF di mesin lokal Anda atau dengan pengujian unit. | — | — |
| 4 | Yes | Bundel kode menjadi file JAR. | — | — |
| 5 | Yes | Unggah file JAR sebagai resource ke Proyek MaxCompute Anda. | MaxCompute client (odpscmd), MaxCompute Studio, DataWorks | MaxCompute client: Add resources, Create a UDF; MaxCompute Studio: Package a Java program, upload the package, and create a MaxCompute UDF; DataWorks: Create and use MaxCompute resources, Create and use a MaxCompute function |
| 6 | Yes | Buat UDF berdasarkan file JAR yang diunggah. | — | — |
| 7 | No | Panggil UDAF dalam kueri. | — | — |
Python UDAF
Gambar berikut menunjukkan alur kerja pengembangan Python UDAF.

| Step | Required | Description | Platform | References |
|---|---|---|---|---|
| 1 | Yes | Tulis UDAF. | MaxCompute Studio | Develop a Python UDF |
| 2 | Yes | Debug UDAF di mesin lokal Anda atau dengan pengujian unit. | — | — |
| 3 | Yes | Unggah file Python dan resource yang diperlukan (file resources, table resources, paket pihak ketiga) ke Proyek MaxCompute Anda. | MaxCompute client (odpscmd), MaxCompute Studio, DataWorks | MaxCompute client: Add resources, Create a UDF; MaxCompute Studio: Upload a Python program and create a MaxCompute UDF; DataWorks: Use resources to register functions |
| 4 | Yes | Buat UDF berdasarkan file Python atau resource yang diunggah. | — | — |
| 5 | No | Panggil UDAF dalam kueri. | — | — |
Batasan
UDAF tidak dapat mengakses Internet. Untuk mengaktifkan akses Internet, ajukan permohonan koneksi jaringan. Setelah disetujui, tim dukungan teknis MaxCompute akan membantu Anda menyiapkan koneksi tersebut. Untuk detailnya, lihat Network connection process.
Catatan penggunaan
Kinerja: Fungsi bawaan memiliki kinerja lebih baik daripada UDAF. Gunakan fungsi bawaan bila tersedia untuk kasus penggunaan Anda.
Memori: Jika pernyataan SQL yang menggunakan UDAF melebihi alokasi memori default karena volume data besar atau kesenjangan data, jalankan perintah berikut pada tingkat session untuk menaikkan batas:
set odps.sql.udf.joiner.jvm.memory=xxxx;Untuk informasi lebih lanjut, lihat FAQ about MaxCompute UDFs.
Tumbukan nama: Jika UDAF memiliki nama yang sama dengan fungsi bawaan, MaxCompute akan memanggil UDAF tersebut. Untuk memanggil fungsi bawaan, tambahkan awalan
::, contohnya:select ::concat('ab', 'c');
Memanggil UDAF
Dalam proyek yang sama: Panggil UDAF dengan cara yang sama seperti memanggil fungsi bawaan.
Antar proyek: Gunakan nama proyek sebagai awalan. Contoh berikut memanggil udf_in_other_project dari Proyek B di dalam Proyek A:
select B:udf_in_other_project(arg0, arg1) as res from table_t;Untuk pengaturan berbagi sumber daya antar proyek, lihat Cross-project resource access based on packages.