Fungsi bernilai tabel yang ditentukan pengguna (User-defined table-valued functions/UDTF) memungkinkan Anda memperluas kemampuan bawaan MaxCompute dengan menulis fungsi kustom dalam Java atau Python. UDTF membaca satu baris input dan mengembalikan beberapa baris—outputnya diperlakukan sebagai tabel.
MaxCompute menyediakan beberapa UDTF bawaan, seperti EXPLODE. Untuk informasi lebih lanjut, lihat Fungsi lainnya dan Fungsi tipe kompleks.
Kapan menggunakan UDTF
Gunakan UDTF ketika fungsi bawaan tidak dapat merepresentasikan logika Anda—misalnya, ketika Anda perlu menghasilkan jumlah baris output yang bervariasi per baris input atau ketika transformasi Anda bergantung pada status yang terakumulasi di seluruh baris dalam suatu partisi.
Fungsi bawaan telah dioptimalkan untuk mesin terdistribusi MaxCompute dan memberikan kinerja lebih baik daripada UDTF dalam skala besar. Gunakan fungsi bawaan kapan pun mencakup kasus penggunaan Anda.
Bahasa yang didukung
| Bahasa | Versi |
|---|---|
| Java | — |
| Python 2 | 2.7 |
| Python 3 | CPython 3.7.3 |
Untuk detail implementasi, lihat UDTF Java, UDTF Python 2, dan UDTF Python 3.
Batasan
-
Akses Internet: UDF tidak dapat mengakses Internet secara default. Untuk mengaktifkan akses Internet, isi formulir permohonan koneksi jaringan. Setelah disetujui, tim dukungan teknis MaxCompute akan menghubungi Anda untuk menyiapkan koneksi tersebut. Untuk detailnya, lihat Proses koneksi jaringan.
-
Tidak ada kolom lain dalam `SELECT` yang sama: Pernyataan
SELECTyang memanggil UDTF tidak boleh mereferensikan kolom atau ekspresi lain. Pernyataan berikut tidak valid:-- Tidak valid: mencampur UDTF dengan kolom lain select value, user_udtf(key) as mycol ... -
Tidak boleh bersarang: UDTF tidak dapat disarangkan di dalam UDTF lain. Pernyataan berikut tidak valid:
-- Tidak valid: user_udtf2 disarangkan di dalam user_udtf1 select user_udtf1(user_udtf2(key)) as mycol...; -
Tidak kompatibel dengan `GROUP BY`, `DISTRIBUTE BY`, dan `SORT BY`: UDTF tidak boleh muncul dalam pernyataan
SELECTyang sama dengan klausa-klausa tersebut. Pernyataan berikut tidak valid:-- Tidak valid: UDTF digunakan bersama GROUP BY select user_udtf(key) as mycol ... group by mycol;
Catatan penggunaan
Memori: Jika pekerjaan UDF memproses volume data besar dengan kesenjangan data, pekerjaan tersebut dapat melebihi alokasi memori JVM default. Jalankan perintah berikut pada tingkat sesi untuk menambah memori:
set odps.sql.udf.joiner.jvm.memory=xxxx;
Untuk daftar lengkap topik FAQ UDF, lihat FAQ tentang UDF MaxCompute.
Konflik nama: Jika UDF memiliki nama yang sama dengan fungsi bawaan, MaxCompute akan memanggil UDF tersebut. Untuk secara eksplisit memanggil fungsi bawaan, tambahkan awalan :::
select ::concat('ab', 'c');
Proses pengembangan
Langkah-langkahnya sedikit berbeda antara Java dan Python.
Java
| Langkah | Wajib | Deskripsi | Alat |
|---|---|---|---|
| 1 | Tidak | Tambahkan dependensi Maven SDK ke file POM Anda. Cari odps-sdk-udf di repositori Maven untuk mendapatkan versi terbaru. Cuplikan contoh: <dependency><groupId>com.aliyun.odps</groupId><artifactId>odps-sdk-udf</artifactId><version>0.29.10-public</version></dependency> |
IntelliJ IDEA (Maven) |
| 2 | Ya | Tulis kode UDTF. | IntelliJ IDEA (Maven) atau MaxCompute Studio |
| 3 | Ya | Debug UDTF di mesin lokal Anda atau melalui pengujian unit. | — |
| 4 | Ya | Bundel UDTF ke dalam file JAR. | — |
| 5 | Ya | Unggah file JAR sebagai resource ke Proyek MaxCompute Anda. | Klien MaxCompute, MaxCompute Studio, atau DataWorks |
| 6 | Ya | Daftarkan UDTF menggunakan file JAR yang diunggah. | — |
| 7 | Tidak | Panggil UDTF dalam kueri SQL. | — |
Untuk langkah 2, lihat Mengembangkan UDF dalam Java. Untuk langkah 5, lihat Menambahkan resource dan Membuat fungsi. Untuk melakukan bundel dan pendaftaran dalam satu alur menggunakan MaxCompute Studio, lihat Membundel program Java, mengunggah paket, dan membuat UDF MaxCompute.
Python
| Langkah | Wajib | Deskripsi | Alat |
|---|---|---|---|
| 1 | Ya | Tulis kode UDTF. | MaxCompute Studio |
| 2 | Ya | Debug UDTF di mesin lokal Anda atau melalui pengujian unit. | — |
| 3 | Ya | Unggah file Python atau resource yang diperlukan (resource file, resource tabel, paket pihak ketiga) ke Proyek MaxCompute Anda. | Klien MaxCompute, MaxCompute Studio, atau DataWorks |
| 4 | Ya | Daftarkan UDTF berdasarkan file yang diunggah. | — |
| 5 | Tidak | Panggil UDTF dalam kueri SQL. | — |
Untuk langkah 1, lihat Mengembangkan UDF Python. Untuk langkah 3, lihat Menambahkan resource dan Membuat fungsi. Untuk mengunggah dan mendaftarkan dalam satu alur menggunakan MaxCompute Studio, lihat Mengunggah program Python dan membuat UDF MaxCompute.
Memanggil UDTF
Dalam proyek yang sama: Panggil UDTF dengan cara yang sama seperti memanggil fungsi bawaan.
Antar proyek: Untuk memanggil UDTF dari proyek B di dalam proyek A, gunakan sintaks berikut:
select B:udf_in_other_project(arg0, arg1) as res from table_t;
Untuk informasi lebih lanjut tentang Berbagi sumber daya antar proyek, lihat Berbagi sumber daya berbasis paket antar proyek.