Jika fungsi bawaan MaxCompute tidak memenuhi kebutuhan bisnis Anda, Anda dapat menggunakan alat pengembangan seperti IntelliJ IDEA (Maven) atau MaxCompute Studio untuk menulis fungsi yang ditentukan pengguna (UDF) dengan mengikuti prosedur dalam topik ini dan memanggil UDF tersebut di MaxCompute. Topik ini menjelaskan cara menulis UDF dalam Java.
Batasan
Mengakses Internet menggunakan UDF
Secara default, MaxCompute tidak mengizinkan akses Internet melalui UDF. Jika Anda perlu mengakses Internet menggunakan UDF, isi formulir aplikasi koneksi jaringan sesuai kebutuhan bisnis Anda dan ajukan aplikasi tersebut. Setelah disetujui, tim dukungan teknis MaxCompute akan menghubungi Anda untuk membantu menetapkan koneksi jaringan. Untuk informasi lebih lanjut tentang cara mengisi formulir aplikasi koneksi jaringan, lihat Proses Koneksi Jaringan.
Mengakses VPC menggunakan UDF
Secara default, MaxCompute tidak mengizinkan akses ke sumber daya di VPC melalui UDF. Untuk menggunakan UDF untuk mengakses sumber daya di VPC, Anda harus menetapkan koneksi jaringan antara MaxCompute dan VPC. Untuk informasi lebih lanjut tentang operasi terkait, lihat Gunakan UDF untuk Mengakses Sumber Daya di VPC.
Membaca data tabel menggunakan UDF, UDAF, atau UDTF
Anda tidak dapat menggunakan UDF, UDAF, atau UDTF untuk membaca data dari jenis tabel berikut:
Tabel tempat dilakukan evolusi skema.
Tabel yang berisi tipe data kompleks.
Tabel yang berisi tipe data JSON.
Tabel transaksional.
Peringatan
Sebelum menulis UDF Java, Anda harus memahami struktur kode UDF serta pemetaan antara tipe data yang digunakan oleh UDF Java dan tipe data yang didukung oleh MaxCompute. Untuk informasi lebih lanjut tentang pemetaan tipe data, lihat Lampiran: Tipe Data.
Sebelum menulis UDF Java, perhatikan poin-poin berikut:
Kami merekomendasikan agar file JAR dari UDF yang berbeda tidak mengandung kelas dengan nama yang sama tetapi logika yang berbeda. Sebagai contoh, file JAR UDF 1 bernama udf1.jar dan file JAR UDF 2 bernama udf2.jar. Kedua file tersebut mengandung kelas bernama
com.aliyun.UserFunction.class, tetapi kelas tersebut memiliki logika yang berbeda di setiap file. Jika UDF 1 dan UDF 2 dipanggil dalam pernyataan SQL yang sama, MaxCompute akan memuat com.aliyun.UserFunction.class dari salah satu dari dua file tersebut. Akibatnya, UDF tidak dapat berjalan sesuai harapan dan mungkin terjadi kesalahan kompilasi.Tipe data parameter input atau nilai balik dari UDF Java adalah objek. Huruf pertama dari tipe data ini harus huruf kapital, seperti String.
Nilai NULL dalam SQL MaxCompute direpresentasikan oleh NULL dalam Java. Tipe data primitif dalam Java tidak dapat merepresentasikan nilai NULL dalam SQL MaxCompute. Oleh karena itu, tipe data ini tidak dapat digunakan.
Proses pengembangan UDF
Saat mengembangkan UDF, Anda harus melakukan persiapan, menulis kode UDF, mengunggah program Python, membuat UDF, dan men-debug UDF. MaxCompute memungkinkan Anda menggunakan beberapa alat untuk mengembangkan UDF, seperti MaxCompute Studio, DataWorks, dan klien MaxCompute (odpscmd). Bagian ini memberikan contoh tentang cara mengembangkan UDF menggunakan MaxCompute Studio, DataWorks, dan klien MaxCompute (odpscmd).
Gunakan MaxCompute Studio
Contoh ini menunjukkan cara menggunakan MaxCompute Studio untuk mengembangkan dan memanggil UDF Java yang digunakan untuk mengonversi semua huruf menjadi huruf kecil.
Lakukan persiapan.
Sebelum menggunakan MaxCompute Studio untuk mengembangkan dan men-debug UDF, Anda harus menginstal MaxCompute Studio dan menghubungkan MaxCompute Studio ke proyek MaxCompute. Untuk informasi lebih lanjut tentang cara menginstal MaxCompute Studio dan menghubungkan MaxCompute Studio ke proyek MaxCompute, lihat topik-topik berikut:
Tulis kode UDF.
Di panel navigasi sisi kiri tab Project, pilih , klik kanan java, lalu pilih .

Di kotak dialog Create new MaxCompute java class, klik UDF, masukkan nama kelas di bidang Name, lalu tekan Enter.

Name: Nama kelas Java MaxCompute. Jika paket belum dibuat, masukkan nama dalam format Nama Paket.Nama Kelas. Sistem secara otomatis membuat paket dengan nama dalam format ini. Dalam contoh ini, kelas diberi nama Lower.
Tulis kode UDF di editor kode.
Kode contoh: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(); } }CatatanAnda dapat men-debug UDF Java di mesin lokal jika diperlukan. Untuk informasi lebih lanjut, lihat Kembangkan dan Debug UDF.
Unggah file JAR dan buat UDF.
Klik kanan file JAR UDF dan pilih Deploy to server.... Di kotak dialog Package a jar, submit resource and register function, konfigurasikan parameter dan klik OK.

MaxCompute project: Nama proyek MaxCompute tempat UDF dimiliki. Pertahankan nilai default, yang menunjukkan bahwa koneksi ke proyek MaxCompute telah ditetapkan saat Anda menulis UDF.
Resource file: Path file sumber yang digunakan oleh UDF. Pertahankan nilai default.
Resource name: Nama sumber daya tempat UDF bergantung. Pertahankan nilai default.
Function name: Nama UDF yang ingin Anda buat. Nama ini digunakan dalam pernyataan SQL yang digunakan untuk memanggil UDF. Contoh: Lower_test.
Debug UDF.
Di panel navigasi sisi kiri, klik tab Project Explore. Klik kanan proyek MaxCompute tempat UDF dimiliki, pilih Open Console, masukkan pernyataan SQL yang digunakan untuk memanggil UDF, lalu tekan Enter untuk mengeksekusi pernyataan SQL.
Pernyataan contoh:select lower_test('ABC');Hasil berikut dikembalikan:
+-----+ | _c0 | +-----+ | abc | +-----+
Gunakan DataWorks
Lakukan persiapan.
Sebelum menggunakan DataWorks untuk mengembangkan dan men-debug UDF, Anda harus mengaktifkan DataWorks dan mengaitkan ruang kerja DataWorks dengan proyek MaxCompute. Untuk informasi lebih lanjut, lihat DataWorks.
Tulis kode UDF.
Anda dapat menulis kode UDF menggunakan alat pengembangan Java dan mengemas kode sebagai file JAR. Kode UDF contoh:
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 file JAR dan buat UDF.
Anda dapat mengunggah paket kode yang Anda kemas di konsol DataWorks dan membuat UDF. Untuk informasi lebih lanjut, lihat topik-topik berikut:
Debug UDF.
Setelah membuat UDF, Anda dapat membuat node ODPS SQL di konsol DataWorks. Anda dapat menulis dan membuat pernyataan SQL di node ODPS SQL untuk memanggil dan men-debug UDF. Untuk informasi lebih lanjut tentang cara membuat node ODPS SQL, lihat Buat Node ODPS SQL. Pernyataan contoh:
select lower_test('ABC');
Gunakan klien MaxCompute (odpscmd)
Lakukan persiapan.
Sebelum menggunakan klien MaxCompute untuk mengembangkan dan men-debug UDF, Anda harus mengunduh paket instalasi klien MaxCompute (GitHub), menginstal klien MaxCompute, lalu mengonfigurasi file config untuk menghubungkan ke proyek MaxCompute. Untuk informasi lebih lanjut, lihat Klien MaxCompute (odpscmd).
Tulis kode UDF.
Anda dapat menulis kode UDF menggunakan alat pengembangan Java dan mengemas kode sebagai file JAR. Kode UDF contoh:
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 file JAR dan buat UDF.
Anda dapat mengunggah file JAR yang Anda kemas di klien MaxCompute dan membuat UDF. Untuk informasi lebih lanjut, lihat topik-topik berikut:
Debug UDF.
Setelah membuat UDF, Anda dapat menulis dan membuat pernyataan SQL untuk men-debug UDF. Pernyataan contoh:
select lower_test('ABC');
Catatan Penggunaan
Setelah mengembangkan UDF Java, Anda dapat menggunakan SQL MaxCompute untuk memanggil UDF. Untuk informasi lebih lanjut tentang cara mengembangkan UDF Java, lihat Proses Pengembangan. Anda dapat memanggil UDF Java menggunakan salah satu metode berikut:
Gunakan UDF di proyek MaxCompute: Metodenya mirip dengan penggunaan fungsi bawaan.
Gunakan UDF lintas proyek: Gunakan UDF 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 Sumber Daya Lintas Proyek Berdasarkan Paket.
Contoh Pengembangan UDF
Lampiran: Struktur Kode UDF
Anda dapat menulis kode UDF dalam Java. Kode tersebut harus mencakup informasi berikut:
Paket Java: Opsional.
Anda dapat mengemas kelas Java yang didefinisikan ke dalam file JAR untuk digunakan di masa mendatang.
Kelas UDF Dasar: Wajib.
Kelas UDF yang diperlukan adalah
com.aliyun.odps.udf.UDF. Jika Anda ingin menggunakan kelas UDF lain atau tipe data kompleks, ikuti petunjuk yang disediakan di Ikhtisar untuk menambahkan kelas yang diperlukan. Sebagai contoh, kelas UDF yang sesuai dengan tipe data STRUCT adalahcom.aliyun.odps.data.Struct.Anotasi
@Resolve: Opsional.Anotasi berada dalam format
@Resolve(<signature>). Parametersignaturedigunakan untuk menentukan tipe data dari parameter input dan nilai kembalian UDF. Jika Anda ingin menggunakan data bertipe STRUCT dalam UDF, Anda tidak dapat menggunakan fitur refleksi untuk kelascom.aliyun.odps.data.Structuntuk mendapatkan nama dan tipe bidang. Dalam hal ini, Anda harus menambahkan anotasi@Resolveke kelas com.aliyun.odps.data.Struct. Anotasiinihanya memengaruhi overloading UDF yang parameter input atau nilai kembaliannya mencakup kelas com.aliyun.odps.data.Struct. Contoh:@Resolve("struct<a:string>,string->string"). Untuk informasi lebih lanjut tentang cara menggunakan tipe data kompleks dalam Java UDF, lihat Gunakan Tipe Data Kompleks dalam Java UDF.Kelas Java Kustom: Wajib.
Kelas Java kustom adalah unit organisasi kode UDF. Kelas ini mendefinisikan variabel dan metode yang digunakan untuk memenuhi kebutuhan bisnis Anda.
Metode
evaluate: Wajib.Metode evaluate adalah metode publik non-statik dan terkandung dalam kelas Java kustom. Tipe data parameter input dan nilai balik metode
evaluatedigunakan sebagai tanda tangan fungsi UDF dalam pernyataan SQL. Tanda tangan fungsi mendefinisikan tipe data parameter input dan nilai balik UDF.Anda dapat mengimplementasikan beberapa metode
evaluatedalam UDF. Saat Anda memanggil UDF, MaxCompute mencocokkan metodeevaluateberdasarkan tipe data parameter input dalam UDF.Saat menulis UDF Java, Anda dapat menggunakan tipe data Java atau tipe data writable Java. Untuk informasi lebih lanjut tentang pemetaan antara tipe data yang didukung dalam proyek MaxCompute, tipe data Java, dan tipe data writable Java, lihat Lampiran: Tipe Data.
Kode Inisialisasi atau Terminasi UDF: Opsional. Anda dapat menggunakan metode
void setup(ExecutionContext ctx)untuk menginisialisasi UDF dan menggunakan metodevoid close()untuk mengakhiri UDF. Metodevoid setup(ExecutionContext ctx)dipanggil sebelum metodeevaluate. Metode void setup(ExecutionContext ctx) dipanggil hanya sekali dan digunakan untuk menginisialisasi sumber daya yang diperlukan untuk komputasi data atau menginisialisasi anggota kelas. Metodevoid close()dipanggil setelah metodeevaluate. Metode void close() digunakan untuk membersihkan data, seperti menutup file.
Kode contoh:
Gunakan Tipe Data Java
// Kemas kelas Java yang didefinisikan ke dalam file bernama org.alidata.odps.udf.examples. package org.alidata.odps.udf.examples; // Wariskan kelas UDF. import com.aliyun.odps.udf.UDF; // Kelas Java kustom. public final class Lower extends UDF { // Metode evaluate. String menunjukkan tipe data parameter input dan return menunjukkan nilai balik. public String evaluate(String s) { if (s == null) { return null; } return s.toLowerCase; } }Gunakan Tipe Data Writable Java
// Kemas kelas Java yang didefinisikan ke dalam file bernama com.aliyun.odps.udf.example. package com.aliyun.odps.udf.example; // Tambahkan kelas yang sesuai dengan tipe data writable Java. import com.aliyun.odps.io.Text; // Wariskan kelas UDF. import com.aliyun.odps.udf.UDF; // Kelas Java kustom. public class MyConcat extends UDF { private Text ret = new Text(); // Metode evaluate. Text menunjukkan tipe data parameter input dan return menunjukkan nilai balik. 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 memungkinkan Anda menggunakan UDF Hive yang versi Hivenya kompatibel dengan MaxCompute. Untuk informasi lebih lanjut, lihat UDF Hive.
Lampiran: Tipe Data
Pemetaan Tipe Data
Tabel berikut menjelaskan pemetaan antara tipe data yang didukung dalam proyek MaxCompute, tipe data Java, dan tipe data writable Java. Anda harus menulis UDF Java berdasarkan pemetaan ini untuk memastikan konsistensi tipe data. Tabel berikut menjelaskan pemetaan tipe data.
Di MaxCompute, edisi tipe data yang berbeda mendukung tipe data yang berbeda. Di MaxCompute V2.0 dan versi lebih baru, lebih banyak tipe data dan tipe data kompleks seperti ARRAY, MAP, dan STRUCT didukung. Untuk informasi lebih lanjut tentang edisi tipe data MaxCompute, lihat Edisi Tipe Data.
Tipe MaxCompute | Tipe Java | Tipe Writable Java |
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 |
Hive UDFs
Jika proyek MaxCompute Anda menggunakan edisi tipe data MaxCompute V2.0 dan mendukung UDF Hive, Anda dapat langsung menggunakan UDF Hive yang versi Hivenya kompatibel dengan MaxCompute.
Versi Hive yang kompatibel dengan MaxCompute adalah 2.1.0, yang sesuai dengan Hadoop 2.7.2. Jika UDF dikembangkan pada versi Hive atau Hadoop lainnya, Anda harus menggunakan Hive 2.1.0 atau Hadoop 2.7.2 untuk mengompilasi ulang file JAR UDF tersebut.
Untuk informasi lebih lanjut tentang cara menggunakan UDF Hive di MaxCompute, lihat Tulis UDF Hive dalam Java.