全部产品
Search
文档中心

MaxCompute:Mengembangkan UDF di Java

更新时间:Jul 06, 2025

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.

  1. 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:

    1. Instal MaxCompute Studio

    2. Hubungkan ke Proyek MaxCompute

    3. Buat Modul Java MaxCompute

  2. Tulis kode UDF.

    1. Di panel navigasi sisi kiri tab Project, pilih src > main > java, klik kanan java, lalu pilih New > MaxCompute Java.新建Java Class

    2. 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.

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

      Anda dapat men-debug UDF Java di mesin lokal jika diperlukan. Untuk informasi lebih lanjut, lihat Kembangkan dan Debug UDF.

  3. 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.注册UDF

    • 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.

  4. 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. 调用UDFPernyataan contoh:

    select lower_test('ABC');

    Hasil berikut dikembalikan:

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

Gunakan DataWorks

  1. 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.

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

    1. Buat dan Gunakan Sumber Daya MaxCompute

    2. Buat dan Gunakan Fungsi MaxCompute

  4. 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)

  1. 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).

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

    1. ADD JAR

    2. CREATE FUNCTION

  4. 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 adalah com.aliyun.odps.data.Struct.

  • Anotasi @Resolve: Opsional.

    Anotasi berada dalam format @Resolve(<signature>). Parameter signature digunakan 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 kelas com.aliyun.odps.data.Struct untuk mendapatkan nama dan tipe bidang. Dalam hal ini, Anda harus menambahkan anotasi @Resolve ke kelas com.aliyun.odps.data.Struct. Anotasi ini hanya 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 evaluate digunakan 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 evaluate dalam UDF. Saat Anda memanggil UDF, MaxCompute mencocokkan metode evaluate berdasarkan 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 metode void close() untuk mengakhiri UDF. Metode void setup(ExecutionContext ctx) dipanggil sebelum metode evaluate. Metode void setup(ExecutionContext ctx) dipanggil hanya sekali dan digunakan untuk menginisialisasi sumber daya yang diperlukan untuk komputasi data atau menginisialisasi anggota kelas. Metode void close() dipanggil setelah metode evaluate. 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.

Catatan

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.