All Products
Search
Document Center

MaxCompute:Mengembangkan Java UDF

Last Updated:Aug 15, 2026

Jika fungsi bawaan MaxCompute tidak memenuhi kebutuhan Anda, Anda dapat membuat user-defined function (UDF) dalam Java menggunakan alat pengembangan seperti IntelliJ IDEA (Maven) atau MaxCompute Studio, lalu memanggil UDF tersebut dalam Pernyataan SQL MaxCompute.

Batasan

  • Akses Internet menggunakan UDF

    Secara default, MaxCompute tidak mengizinkan akses Internet melalui UDF. Jika Anda ingin mengakses Internet melalui UDF, isi formulir permohonan koneksi jaringan (network connection application form) sesuai kebutuhan bisnis Anda dan kirimkan permohonan tersebut. Setelah disetujui, tim dukungan teknis MaxCompute akan menghubungi Anda untuk menyiapkan koneksi jaringan. Untuk informasi lebih lanjut tentang cara mengisi formulir permohonan koneksi jaringan, lihat Network connection process.

  • Akses VPC menggunakan UDF

    Secara default, MaxCompute tidak mengizinkan akses ke resource di VPC melalui UDF. Untuk mengakses resource di VPC menggunakan UDF, Anda harus menyiapkan koneksi jaringan antara MaxCompute dan VPC tersebut. Untuk informasi lebih lanjut tentang prosedur terkait, lihat Access VPC resources from a UDF.

  • Membaca data tabel menggunakan UDF, UDAF, atau UDTF

    Anda tidak dapat menggunakan UDF, UDAF, atau UDTF untuk membaca data dari jenis 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 Java UDF, pahami terlebih dahulu struktur kode UDF dan pemetaan tipe data antara Java dan MaxCompute. Untuk informasi lebih lanjut, lihat Lampiran: Tipe data.

Saat menulis Java UDF, perhatikan hal-hal berikut:

  • Hindari menyertakan kelas dengan nama yang sama tetapi logika berbeda dalam file JAR UDF yang berbeda. Misalnya, jika UDF1 dan UDF2 masing-masing berkorespondensi dengan udf1.jar dan udf2.jar, dan kedua file JAR tersebut berisi com.aliyun.UserFunction.class dengan logika berbeda, pemanggilan kedua UDF tersebut dalam satu Pernyataan SQL akan menyebabkan MaxCompute memuat salah satu kelas secara acak. Hal ini dapat menghasilkan output yang tidak terduga atau kegagalan kompilasi.

  • Dalam Java UDF, parameter input dan nilai kembali harus menggunakan tipe objek (seperti String dan Long), bukan tipe primitif (seperti int dan long).

  • Nilai NULL dalam SQL dipetakan ke null dalam Java. Tipe primitif Java tidak dapat merepresentasikan nilai null sehingga 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 menunjukkan alur kerja ini menggunakan MaxCompute Studio, DataWorks, dan odpscmd.

Gunakan MaxCompute Studio

Contoh berikut menunjukkan cara mengembangkan dan memanggil Java UDF yang mengonversi karakter menjadi huruf kecil menggunakan MaxCompute Studio.

  1. Siapkan lingkungan.

    Sebelum mengembangkan dan melakukan debugging UDF di MaxCompute Studio, instal MaxCompute Studio dan hubungkan ke proyek MaxCompute. Untuk informasi lebih lanjut, lihat topik berikut:

    1. Install MaxCompute Studio

    2. Connect to a MaxCompute project

    3. Create a MaxCompute Java module

  2. Tulis kode UDF.

    1. Pada explorer Project, klik kanan direktori kode sumber modul (src > main > java) dan pilih New > MaxCompute Java.

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

      Name menentukan nama kelas Java MaxCompute yang akan dibuat. Jika Anda belum membuat package, masukkan packagename.classname untuk membuatnya secara otomatis. Dalam contoh ini, kelas diberi nama Lower.

    3. 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();
          }
      }
      Catatan

      Untuk melakukan debugging Java UDF secara lokal, lihat Develop and debug UDFs.

  3. 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 lalu klik OK.

    • MaxCompute project: Proyek MaxCompute tempat UDF berada. Karena UDF ditulis dalam proyek MaxCompute yang telah terhubung, Anda dapat menggunakan nilai default.

    • Resource file: Jalur file resource yang digunakan oleh UDF. Anda dapat menggunakan nilai default.

    • Resource name: Resource yang digunakan oleh UDF. Anda dapat menggunakan nilai default.

    • Function name: Nama yang digunakan untuk memanggil UDF dalam Pernyataan SQL. Contohnya, Lower_test.

  4. 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 lalu tekan Enter. Contohnya:

    select lower_test('ABC');

    Hasil berikut dikembalikan.

    +-----+
    | _c0 |
    +-----+
    | abc |
    +-----+

Gunakan DataWorks

  1. Siapkan lingkungan.

    Sebelum mengembangkan dan men-debug UDF di DataWorks, aktifkan DataWorks terlebih dahulu dan tautkan proyek MaxCompute ke dalamnya. Untuk informasi selengkapnya, lihat Gunakan DataWorks.

  2. Tulis kode UDF.

    Anda dapat menulis kode UDF di alat pengembangan Java apa pun dan mengemasnya sebagai 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();
        }
    }
  3. Unggah dan daftarkan UDF.

    Anda dapat mengunggah kode yang telah dikemas ke DataWorks dan mendaftarkan UDF tersebut. Untuk informasi lebih lanjut, lihat topik berikut:

    1. Create and use MaxCompute resources

    2. Create and use a MaxCompute function

  4. Lakukan debugging UDF.

    Setelah UDF didaftarkan, buat node ODPS SQL dan jalankan Pernyataan 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. Contohnya:

    select lower_test('ABC');

Gunakan odpscmd

  1. Siapkan lingkungan.

    Untuk mengembangkan dan men-debug UDF menggunakan odpscmd, instal Klien dan konfigurasikan koneksi ke Proyek MaxCompute. Untuk informasi selengkapnya, lihat Menggunakan klien MaxCompute (odpscmd).

  2. Tulis kode UDF.

    Anda dapat menulis kode UDF di alat pengembangan Java apa pun dan mengemasnya sebagai 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();
        }
    }
  3. Unggah dan daftarkan UDF.

    Anda dapat mengunggah kode yang telah dikemas menggunakan odpscmd dan mendaftarkan UDF tersebut. Untuk informasi lebih lanjut, lihat:

    1. ADD JAR

    2. CREATE FUNCTION

  4. Lakukan debugging UDF.

    Setelah UDF didaftarkan, tulis dan jalankan Pernyataan SQL untuk melakukan debugging. Contohnya:

    select lower_test('ABC');

Memanggil UDF

Setelah Anda mengembangkan Java UDF seperti yang dijelaskan dalam alur kerja pengembangan UDF, Anda dapat memanggilnya dalam SQL MaxCompute. Metode berikut tersedia:

  • Gunakan UDF dalam proyek MaxCompute: Caranya mirip dengan penggunaan fungsi bawaan.

  • Gunakan UDF lintas proyek: Gunakan UDF dari Proyek B di Proyek A. Contoh pernyataannya: select B:udf_in_other_project(arg0, arg1) as res from table_t;. Untuk informasi lebih lanjut tentang berbagi lintas proyek, lihat Cross-project resource access based on packages.

Contoh UDF

Lampiran: Struktur kode UDF

Java UDF terdiri atas bagian-bagian berikut:

  • Package Java: Opsional.

    Anda dapat mengelompokkan kelas Java ke dalam package untuk mempermudah penggunaan ulang dan pengorganisasian.

  • 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. Sebagai contoh, kelas untuk tipe data STRUCT adalah com.aliyun.odps.data.Struct.

  • Anotasi @Resolve: Opsional.

    Formatnya adalah @Resolve(<signature>), di mana signature mendefinisikan tipe data parameter input dan nilai kembali. Saat Anda menggunakan tipe data STRUCT dalam UDF, refleksi tidak dapat mengambil nama field dan tipe field dari com.aliyun.odps.data.Struct. Dalam kasus ini, Anda harus menggunakan anotasi @Resolve untuk mengambilnya. Jika Anda menggunakan STRUCT dalam UDF, tambahkan anotasi @Resolve ke kelas UDF. Anotasi ini hanya berpengaruh pada overload yang parameternya atau nilai kembalinya mengandung com.aliyun.odps.data.Struct. Contohnya: @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 serta mendefinisikan variabel dan metode yang mengimplementasikan logika bisnis Anda.

  • Metode evaluate: Wajib.

    Kelas Java kustom Anda harus menyertakan metode evaluate publik non-statis. Tipe data parameter input dan nilai kembalinya menentukan signature SQL UDF.

    Anda dapat mengimplementasikan beberapa metode evaluate. Saat Anda memanggil UDF, MaxCompute memilih metode evaluate yang sesuai berdasarkan tipe argumennya.

    Saat menulis Java UDF, 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) dan void close(). Metode void setup(ExecutionContext ctx) dipanggil sekali sebelum metode evaluate dan dapat digunakan untuk menginisialisasi resource atau objek anggota yang diperlukan untuk komputasi. Metode void close() dipanggil sekali setelah semua pemanggilan evaluate selesai 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. Untuk informasi lebih lanjut, lihat Hive UDF compatibility.

Lampiran: Tipe data

Pemetaan tipe data

Untuk memastikan tipe data yang digunakan dalam Java UDF konsisten dengan tipe data MaxCompute, gunakan pemetaan berikut.

Catatan

Tipe data yang didukung oleh MaxCompute bervariasi tergantung edisi tipe datanya. Mulai dari MaxCompute 2.0, tipe data tambahan tersedia, termasuk tipe kompleks seperti ARRAY, MAP, dan STRUCT. Untuk informasi lebih lanjut, 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, error 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 terenkripsi Base64 dan menggunakan tipe String sebagai nilai kembali.

Kompatibilitas Hive UDF

Jika proyek MaxCompute Anda menggunakan edisi tipe data 2.0, MaxCompute mendukung UDF bergaya Hive. Anda dapat langsung menggunakan Hive UDF yang dikembangkan untuk versi Hive yang kompatibel.

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 dengan Hive 2.1.0 atau Hadoop 2.7.2.

Untuk contoh lengkap penggunaan Hive UDF di MaxCompute, lihat UDF Example: Hive Compatibility.