Apache Hive menyediakan banyak fungsi bawaan untuk pemrosesan data. Jika fungsi bawaan tidak mencakup logika yang Anda butuhkan—seperti transformasi string kustom, enkripsi data, atau perhitungan spesifik domain—Anda dapat membuat user-defined function (UDF) sebagai gantinya.
Jenis UDF
Apache Hive mendukung tiga jenis UDF:
| Type | Full name | Behavior |
|---|---|---|
| UDF | User-defined scalar function | Pemetaan satu-ke-satu: membaca satu baris, mengembalikan satu nilai |
| UDTF | User-defined table-valued function | Mengembalikan beberapa baris per input; satu-satunya jenis yang dapat mengembalikan multiple fields |
| UDAF | User-defined aggregate function | Pemetaan banyak-ke-satu: mengagregasi beberapa baris menjadi satu nilai output; digunakan dengan GROUP BY |
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Kluster E-MapReduce (EMR) dengan akses SSH. Lihat Log on to a cluster
Java Development Kit (JDK) yang telah diinstal
Apache Maven yang telah diinstal dan dikonfigurasi
Lingkungan pengembangan terintegrasi (IDE) untuk pengembangan Java
Kembangkan kode UDF
Bagian ini menjelaskan langkah-langkah membuat UDF sederhana yang menambahkan :HelloWorld ke string input.
1. Buat proyek Maven
Di IDE Anda, buat proyek Maven baru dengan koordinat berikut. Sesuaikan groupId dan artifactId agar sesuai dengan organisasi dan nama proyek Anda.
<groupId>org.example</groupId>
<artifactId>hiveudf</artifactId>
<version>1.0-SNAPSHOT</version>2. Tambahkan dependensi Hive
Tambahkan dependensi berikut ke file pom.xml Anda:
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>2.3.7</version>
<exclusions>
<exclusion>
<groupId>org.pentaho</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>3. Implementasikan kelas UDF
Buat kelas yang memperluas org.apache.hadoop.hive.ql.exec.UDF dan implementasikan metode evaluate(). Nama kelas dapat berupa apa saja; contoh ini menggunakan MyUDF.
package org.example;
import org.apache.hadoop.hive.ql.exec.UDF;
public class MyUDF extends UDF {
public String evaluate(final String s) {
if (s == null) { return null; }
return s + ":HelloWorld";
}
}4. Bangun file JAR
Di direktori yang berisi file pom.xml, jalankan perintah berikut:
mvn clean package -DskipTestsFile JAR hasil build, yaitu hiveudf-1.0-SNAPSHOT.jar, akan tersedia di direktori target.
Deploy dan daftarkan UDF
1. Transfer JAR ke kluster Anda
Gunakan SSH Secure File Transfer Client untuk mengunggah file hiveudf-1.0-SNAPSHOT.jar ke direktori root kluster EMR Anda.
2. Unggah JAR ke HDFS
Login ke kluster Anda melalui SSH.
Unggah file JAR ke Hadoop Distributed File System (HDFS):
hadoop fs -put hiveudf-1.0-SNAPSHOT.jar /user/hive/warehouse/Verifikasi bahwa unggahan berhasil:
hadoop fs -ls /user/hive/warehouse/Output yang diharapkan:
Found 1 items -rw-r--r-- 1 xx xx 2668 2021-06-09 14:13 /user/hive/warehouse/hiveudf-1.0-SNAPSHOT.jar
3. Daftarkan UDF di Hive
Buka Hive CLI:
hiveDaftarkan UDF sebagai fungsi permanen:
create function myfunc as "org.example.MyUDF" using jar "hdfs:///user/hive/warehouse/hiveudf-1.0-SNAPSHOT.jar";Dalam perintah tersebut:
| Parameter | Description |
|---|---|
myfunc | Nama fungsi yang digunakan dalam kueri |
org.example.MyUDF | Nama kelas lengkap dari JAR |
hdfs:///user/hive/warehouse/hiveudf-1.0-SNAPSHOT.jar | Path HDFS ke file JAR |
Jika pendaftaran berhasil, outputnya akan mirip dengan:
Added [/private/var/folders/2s/wzzsgpn13rn8rl_0fc4xxkc00000gp/T/40608d4a-a0e1-4bf5-92e8-b875fa6a1e53_resources/hiveudf-1.0-SNAPSHOT.jar] to class path
Added resources: [hdfs:///user/hive/warehouse/myfunc/hiveudf-1.0-SNAPSHOT.jar]4. Uji UDF
Panggil UDF dalam kueri seperti fungsi bawaan lainnya:
select myfunc("abc");Output yang diharapkan:
OK
abc:HelloWorldUntuk memastikan fungsi telah terdaftar, jalankan perintah berikut:
SHOW FUNCTIONS LIKE '*myfunc*';Pemecahan Masalah
Perintah `create function` gagal dengan error class not found
Pastikan nama kelas dalam pernyataan create function sesuai dengan nama kelas lengkap di file JAR Anda, termasuk awalan paketnya. Misalnya, jika kelas Anda adalah MyUDF dalam paket org.example, referensinya harus berupa org.example.MyUDF, bukan hanya MyUDF.
UDF mengembalikan `null` untuk semua input
Periksa logika penanganan nilai null pada metode evaluate(). Implementasi contoh mengembalikan null ketika inputnya null. Jika fungsi Anda seharusnya menangani nilai null secara berbeda, perbarui metode tersebut sesuai kebutuhan.