Jika fungsi bawaan MaxCompute tidak memenuhi kebutuhan Anda, gunakan alur kerja dalam topik ini untuk membuat user-defined function (UDF) di tool pengembangan seperti IntelliJ IDEA (Maven) atau MaxCompute Studio. UDF tersebut kemudian dapat dipanggil di MaxCompute untuk mendukung berbagai kasus penggunaan. Topik ini menjelaskan cara menulis UDF dalam Java.
Batasan ketat
Akses Internet — Secara default, UDF tidak dapat mengakses Internet. Untuk mengaktifkan akses Internet, ajukan permohonan koneksi jaringan. Setelah disetujui, tim dukungan teknis MaxCompute akan menghubungi Anda untuk menyiapkan koneksi tersebut. Untuk detailnya, lihat Network Connection Request FormNetwork connection process.
Akses VPC — Secara default, UDF tidak dapat mengakses resource di virtual private cloud (VPC). Untuk mengaktifkan akses VPC, buat koneksi jaringan antara MaxCompute dan VPC tersebut. Untuk detailnya, lihat Use UDFs to access resources in VPCs.
Tipe tabel yang tidak didukung — UDF, UDAF, dan UDTF tidak dapat membaca data dari tipe tabel berikut:
-
Tabel yang telah menjalani schema evolution
-
Tabel yang berisi tipe data kompleks
-
Tabel yang berisi tipe data JSON
-
Tabel transaksional
Catatan penggunaan
Sebelum menulis UDF Java, Anda harus memahami struktur kode UDF serta pemetaan antara tipe data UDF Java dan tipe data MaxCompute. Untuk informasi lebih lanjut tentang pemetaan tersebut, lihat Lampiran: Tipe data.
Saat menulis UDF Java, perhatikan hal-hal berikut:
-
Hindari menyertakan kelas dengan nama yang sama tetapi logika berbeda di file JAR UDF yang berbeda. Misalnya, asumsikan bahwa UDF1 dan UDF2 masing-masing berkorespondensi dengan file resource JAR udf1.jar dan udf2.jar, dan kedua file JAR tersebut berisi kelas bernama
com.aliyun.UserFunction.classtetapi dengan logika berbeda. Jika Anda memanggil UDF1 dan UDF2 dalam satu pernyataan SQL yang sama, MaxCompute akan memuat salah satu kelas secara acak. Hal ini dapat menyebabkan hasil eksekusi yang tidak terduga atau bahkan kegagalan kompilasi. -
Dalam UDF Java, tipe data parameter input dan nilai kembali harus berupa tipe objek (misalnya, String, Long), bukan tipe primitif (misalnya, int, long).
-
Nilai NULL dalam SQL dipetakan ke NULL dalam Java. Tipe primitif Java tidak dapat merepresentasikan nilai NULL dalam SQL dan tidak diperbolehkan.
Alur kerja pengembangan UDF
Pengembangan UDF mencakup beberapa langkah: menyiapkan lingkungan, menulis kode UDF, mengunggah file JAR, mendaftarkan UDF, dan debugging. Bagian-bagian berikut menjelaskan alur kerja ini menggunakan MaxCompute Studio, DataWorks, dan odpscmd.
Gunakan MaxCompute Studio
Contoh berikut menunjukkan cara mengembangkan dan memanggil UDF Java yang mengonversi karakter menjadi huruf kecil di MaxCompute Studio.
-
Siapkan lingkungan.
Sebelum mengembangkan dan melakukan debugging UDF di MaxCompute Studio, Anda harus menginstal MaxCompute Studio dan menghubungkannya ke proyek MaxCompute. Untuk informasi lebih lanjut, lihat topik-topik berikut:
-
Tulis kode UDF.
-
Pada explorer Project, klik kanan direktori kode sumber modul () dan pilih .

-
Pada kotak dialog Create new MaxCompute java class, klik UDF, masukkan nama kelas pada bidang Name, lalu tekan Enter.

Name menentukan nama MaxCompute Java Class yang akan dibuat. Jika Anda belum membuat package, Anda dapat memasukkan packagename.classname untuk membuatnya secara otomatis. Dalam contoh ini, Java Class diberi nama Lower.
-
Tulis kode UDF di editor kode.
Contohnya:package com.aliyun.odps.udf.example; import com.aliyun.odps.udf.UDF; public final class Lower extends UDF { public String evaluate(String s) { if (s == null) { return null; } return s.toLowerCase(); } }CatatanUntuk melakukan debugging UDF Java secara lokal, lihat Develop and debug UDFs.
-
-
Unggah dan daftarkan UDF.
Klik kanan file Java UDF dan pilih Deploy to server.... Pada kotak dialog Package a jar, submit resource and register function, konfigurasikan parameter dan klik OK.

-
MaxCompute project: Nama proyek MaxCompute tempat UDF berada. Karena UDF ditulis di proyek MaxCompute yang telah terhubung, Anda dapat mempertahankan nilai default.
-
Resource file: Jalur file resource yang digunakan oleh UDF. Anda dapat mempertahankan nilai default.
-
Resource name: Resource yang digunakan oleh UDF. Anda dapat mempertahankan nilai default.
-
Function name: Nama yang digunakan untuk memanggil UDF dalam pernyataan SQL. Contohnya, Lower_test.
-
-
Lakukan debugging UDF.
Pada panel navigasi kiri, klik Project Explore. Klik kanan proyek MaxCompute tujuan dan pilih Open Console. Di konsol, masukkan pernyataan SQL yang memanggil UDF dan tekan Enter untuk menjalankannya.
Contohnya:select lower_test('ABC');Hasil berikut dikembalikan.
+-----+ | _c0 | +-----+ | abc | +-----+
Gunakan DataWorks
-
Siapkan lingkungan.
Sebelum mengembangkan dan melakukan debugging UDF di DataWorks, Anda harus mengaktifkan DataWorks dan mengikat proyek MaxCompute ke dalamnya. Untuk informasi lebih lanjut, lihat Use DataWorks.
-
Tulis kode UDF.
Anda dapat menulis kode UDF di tool pengembangan Java apa pun dan mengemasnya ke dalam file JAR. Contohnya:
package com.aliyun.odps.udf.example; import com.aliyun.odps.udf.UDF; public final class Lower extends UDF { public String evaluate(String s) { if (s == null) { return null; } return s.toLowerCase(); } } -
Unggah dan daftarkan UDF.
Anda dapat mengunggah kode yang telah dikemas ke DataWorks dan mendaftarkan UDF tersebut. Untuk informasi lebih lanjut, lihat topik-topik berikut:
-
Lakukan debugging UDF.
Setelah mendaftarkan UDF, buat node ODPS SQL dan jalankan perintah SQL di dalam node tersebut untuk melakukan debugging UDF. Untuk informasi lebih lanjut tentang cara membuat node ODPS SQL, lihat Create an ODPS SQL node. Berikut adalah contoh perintah debugging.
select lower_test('ABC');
Gunakan odpscmd
-
Siapkan lingkungan.
Untuk mengembangkan dan men-debug UDF menggunakan odpscmd, Anda perlu menginstal klien tersebut serta mengonfigurasi koneksi ke Proyek MaxCompute. Untuk informasi selengkapnya, lihat Menggunakan klien MaxCompute (odpscmd).
-
Tulis kode UDF.
Anda dapat menulis kode UDF di tool pengembangan Java apa pun dan mengemasnya ke dalam file JAR. Contohnya:
package com.aliyun.odps.udf.example; import com.aliyun.odps.udf.UDF; public final class Lower extends UDF { public String evaluate(String s) { if (s == null) { return null; } return s.toLowerCase(); } } -
Unggah dan daftarkan UDF.
Anda dapat mengunggah kode yang telah dikemas menggunakan odpscmd dan mendaftarkan UDF tersebut. Untuk informasi lebih lanjut, lihat topik-topik berikut:
-
Lakukan debugging UDF.
Setelah mendaftarkan UDF, Anda dapat menulis dan menjalankan perintah SQL untuk melakukan debugging UDF. Berikut adalah contoh perintah debugging.
select lower_test('ABC');
Memanggil UDF
Setelah mengembangkan UDF Java seperti yang dijelaskan dalam alur kerja pengembangan UDF sebelumnya, Anda dapat memanggilnya di MaxCompute SQL. Metode berikut tersedia:
Contoh UDF
Lampiran: Struktur kode UDF
UDF Java terdiri dari bagian-bagian berikut:
-
Package Java: Opsional.
Anda dapat mengelompokkan kelas Java Anda ke dalam sebuah package agar lebih mudah ditemukan dan digunakan kembali.
-
Mewarisi kelas UDF: Wajib.
Kelas dasar yang wajib digunakan adalah
com.aliyun.odps.udf.UDF. Jika Anda memerlukan kelas UDF lain atau tipe data kompleks, tambahkan kelas yang diperlukan dari MaxCompute SDK. Misalnya, kelas untuk tipe data STRUCT adalahcom.aliyun.odps.data.Struct. -
Anotasi
@Resolve: Opsional.Formatnya adalah
@Resolve(<signature>), di manasignaturemendefinisikan tipe data parameter input dan nilai kembali. Saat Anda menggunakan tipe data STRUCT dalam UDF, refleksi tidak dapat mengambil nama field dan tipe field daricom.aliyun.odps.data.Struct. Dalam kasus ini, Anda harus menggunakan anotasi@Resolveuntuk mengambilnya. Jika Anda menggunakan STRUCT dalam UDF, tambahkan anotasi@Resolveke kelas UDF. Anotasi ini hanya berpengaruh pada overload yang parameternya atau nilai kembalinya mengandung com.aliyun.odps.data.Struct. Contoh:@Resolve("struct<a:string>,string->string"). Untuk contoh lengkap, lihat UDF Example: Complex Data Types. -
Kelas Java kustom: Wajib.
Ini adalah unit yang mengorganisasi kode UDF Anda. Kelas ini mendefinisikan variabel dan metode yang mengimplementasikan logika bisnis Anda.
-
Metode
evaluate: Wajib.Kelas Java kustom Anda harus menyertakan metode
evaluatepublik non-statis. Tipe data parameter input dan nilai kembalinya menentukan signature SQL UDF tersebut.Anda dapat mengimplementasikan beberapa metode
evaluate. Saat Anda memanggil UDF, MaxCompute memilih metodeevaluateyang tepat berdasarkan tipe argumennya.Saat menulis UDF Java, Anda dapat menggunakan tipe Java atau tipe Java Writable. Untuk pemetaan lengkap antara tipe data MaxCompute dan tipe data Java, lihat Lampiran: Tipe data.
-
Inisialisasi dan pembersihan UDF: Opsional. Anda dapat mengimplementasikan inisialisasi dan pembersihan menggunakan
void setup(ExecutionContext ctx)danvoid close(). Metodevoid setup(ExecutionContext ctx)dipanggil sekali sebelum metodeevaluatedan dapat digunakan untuk menginisialisasi resource atau objek anggota yang diperlukan untuk komputasi. Metodevoid close()dipanggil sekali setelah semua pemanggilanevaluateselesai dan digunakan untuk tugas pembersihan, seperti menutup file.
Contoh berikut menunjukkan dua jenis UDF.
-
Gunakan tipe Java
// Mengorganisasi kelas Java dalam package org.alidata.odps.udf.examples. package org.alidata.odps.udf.examples; // Mewarisi kelas UDF. import com.aliyun.odps.udf.UDF; // Mendefinisikan kelas Java kustom. public final class Lower extends UDF { // Metode evaluate mendefinisikan logika UDF. Metode ini menerima String dan mengembalikan String. public String evaluate(String s) { if (s == null) { return null; } return s.toLowerCase(); } } -
Gunakan tipe Java Writable
// Mengorganisasi kelas Java dalam package com.aliyun.odps.udf.example. package com.aliyun.odps.udf.example; // Menambahkan kelas yang diperlukan untuk tipe Java Writable. import com.aliyun.odps.io.Text; // Mewarisi kelas UDF. import com.aliyun.odps.udf.UDF; // Mendefinisikan kelas Java kustom. public class MyConcat extends UDF { private Text ret = new Text(); // Mendefinisikan metode evaluate. `Text` menentukan tipe data parameter input, dan nilai `return` juga berupa objek Text. public Text evaluate(Text a, Text b) { if (a == null || b == null) { return null; } ret.clear(); ret.append(a.getBytes(), 0, a.getLength()); ret.append(b.getBytes(), 0, b.getLength()); return ret; } }
MaxCompute juga mendukung UDF yang dikembangkan untuk versi Hive yang kompatibel dengannya. Untuk informasi lebih lanjut, lihat Hive UDF compatibility.
Lampiran: Tipe data
Pemetaan tipe data
Untuk memastikan tipe data yang digunakan dalam UDF Java konsisten dengan tipe data yang didukung oleh MaxCompute, gunakan pemetaan berikut.
Tipe data yang didukung oleh MaxCompute bervariasi berdasarkan edisi tipe data. Mulai dari MaxCompute 2.0, lebih banyak tipe data ditambahkan, termasuk tipe data kompleks seperti ARRAY, MAP, dan STRUCT. Untuk informasi lebih lanjut tentang edisi tipe data MaxCompute, lihat Data type editions.
|
Tipe MaxCompute |
Tipe Java |
Tipe Java Writable |
|
TINYINT |
java.lang.Byte |
ByteWritable |
|
SMALLINT |
java.lang.Short |
ShortWritable |
|
INT |
java.lang.Integer |
IntWritable |
|
BIGINT |
java.lang.Long |
LongWritable |
|
FLOAT |
java.lang.Float |
FloatWritable |
|
DOUBLE |
java.lang.Double |
DoubleWritable |
|
DECIMAL |
java.math.BigDecimal |
BigDecimalWritable |
|
BOOLEAN |
java.lang.Boolean |
BooleanWritable |
|
STRING |
java.lang.String |
Text |
|
VARCHAR |
com.aliyun.odps.data.Varchar |
VarcharWritable |
|
BINARY |
com.aliyun.odps.data.Binary |
BytesWritable |
|
DATE |
java.sql.Date |
DateWritable |
|
DATETIME |
java.util.Date |
DatetimeWritable |
|
TIMESTAMP |
java.sql.Timestamp |
TimestampWritable |
|
INTERVAL_YEAR_MONTH |
N/A |
IntervalYearMonthWritable |
|
INTERVAL_DAY_TIME |
N/A |
IntervalDayTimeWritable |
|
ARRAY |
java.util.List |
N/A |
|
MAP |
java.util.Map |
N/A |
|
STRUCT |
com.aliyun.odps.data.Struct |
N/A |
Tipe Java byte[] tidak termasuk dalam daftar tipe Java yang didukung. Jika Anda menggunakan byte[] sebagai parameter input atau nilai kembali metode evaluate, kesalahan ODPS-0130071 akan dilaporkan. Untuk memproses data biner dalam UDF, gunakan tipe Java yang sesuai dengan tipe BINARY MaxCompute: com.aliyun.odps.data.Binary untuk tipe Java standar, atau com.aliyun.odps.io.BytesWritable untuk tipe Writable. Anda juga dapat mengonversi data biner menjadi string yang dienkode Base64 dan menggunakan tipe String sebagai nilai kembali.
Kompatibilitas UDF Hive
Jika proyek MaxCompute Anda menggunakan edisi tipe data 2.0, MaxCompute mendukung UDF bergaya Hive. Anda dapat langsung menggunakan UDF Hive yang dikembangkan pada versi Hive yang kompatibel dengan MaxCompute.
Versi Hive yang kompatibel adalah 2.1.0, yang sesuai dengan Hadoop 2.7.2. Jika UDF Anda dikompilasi dengan versi Hive atau Hadoop yang berbeda, kompilasi ulang file JAR UDF menggunakan Hive 2.1.0 atau Hadoop 2.7.2.
Untuk contoh lengkap penggunaan UDF Hive di MaxCompute, lihat UDF Example: Hive Compatibility.