Hive menyediakan berbagai fungsi bawaan. Jika fungsi bawaan tidak memenuhi kebutuhan komputasi Anda, Anda dapat membuat fungsi yang ditentukan pengguna (UDFs). UDFs dapat digunakan seperti fungsi bawaan umum. Topik ini menjelaskan cara mengembangkan dan menggunakan UDFs.
Informasi latar belakang
Tabel berikut menjelaskan jenis-jenis UDFs.
| Jenis UDF | Deskripsi |
| Fungsi skalar yang ditentukan pengguna (UDF) | Input dan output UDF memiliki pemetaan satu-satu. Setiap kali UDF dipanggil, ia membaca satu baris data dan mengembalikan satu nilai data. |
| Fungsi bernilai tabel yang ditentukan pengguna (UDTF) | Setiap kali UDTF dipanggil, ia mengembalikan beberapa baris data. Di antara semua jenis UDF, hanya UDTF yang dapat mengembalikan beberapa bidang. |
| Fungsi agregat yang ditentukan pengguna (UDAF) | Input dan output UDAF memiliki pemetaan banyak-ke-satu. Setiap kali UDAF dipanggil, ia menggabungkan beberapa catatan input menjadi satu nilai output. Anda dapat menggunakan UDAF dengan klausa GROUP BY dalam pernyataan SQL. |
Kembangkan kode UDF
- Gunakan lingkungan pengembangan terintegrasi (IDE) untuk membuat proyek Maven.Kode berikut menunjukkan informasi dasar proyek. Anda dapat mengonfigurasi parameter groupId dan artifactId sesuai dengan kebutuhan bisnis Anda.
<groupId>org.example</groupId> <artifactId>hiveudf</artifactId> <version>1.0-SNAPSHOT</version> - Tambahkan dependensi berikut ke file pom.xml:
<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> - Buat kelas yang mewarisi kelas UDF Hive.Anda dapat menentukan nama kelas. Dalam contoh ini, nama kelas adalah MyUDF.
package org.example; import org.apache.hadoop.hive.ql.exec.UDF; /** * Hello world! * */ public class MyUDF extends UDF { public String evaluate(final String s) { if (s == null) { return null; } return s + ":HelloWorld"; } } - Kemas kode kustom ke dalam file JAR.Di direktori tempat file pom.xml disimpan, jalankan perintah berikut untuk membuat file JAR:
mvn clean package -DskipTestsFile hiveudf-1.0-SNAPSHOT.jar muncul di direktori target. Pengembangan kode selesai.
Buat dan gunakan UDF
- Gunakan SSH Secure File Transfer Client untuk mengunggah file JAR yang dihasilkan ke direktori root kluster E-MapReduce (EMR) Anda.Pastikan bahwa SSH Secure File Transfer Client telah diinstal di komputer Anda sebelum melakukan langkah ini.
- Unggah file JAR ke Hadoop Distributed File System (HDFS).
- Masuk ke kluster Anda dalam mode SSH. Untuk informasi lebih lanjut, lihat Masuk ke kluster.
- Jalankan perintah berikut untuk mengunggah file JAR ke HDFS:
hadoop fs -put hiveudf-1.0-SNAPSHOT.jar /user/hive/warehouse/Anda dapat menjalankan perintahhadoop fs -ls /user/hive/warehouse/untuk memeriksa apakah unggahan berhasil. Jika informasi berikut dikembalikan, unggahan berhasil:Found 1 items -rw-r--r-- 1 xx xx 2668 2021-06-09 14:13 /user/hive/warehouse/hiveudf-1.0-SNAPSHOT.jar
- Buat UDF.
- Jalankan perintah berikut untuk membuka CLI Hive:
hive - Jalankan perintah berikut untuk membuat UDF berdasarkan file JAR yang diunggah:
create function myfunc as "org.example.MyUDF" using jar "hdfs:///user/hive/warehouse/hiveudf-1.0-SNAPSHOT.jar";Dalam perintah tersebut,
myfuncadalah nama UDF,org.example.MyUDFadalah kelas yang dibuat di bagian Kembangkan Kode UDF, danhdfs:///user/hive/warehouse/hiveudf-1.0-SNAPSHOT.jaradalah jalur HDFS ke mana file JAR diunggah.Jika informasi berikut dikembalikan, UDF telah dibuat: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]null Anda juga dapat menjalankan perintahSHOW FUNCTIONS LIKE '*myfunc*'untuk memeriksa apakah UDF telah dibuat.
- Jalankan perintah berikut untuk membuka CLI Hive:
- Jalankan perintah berikut untuk menggunakan UDF.Anda dapat menentukan nama UDF dalam perintah untuk menggunakan UDF seperti halnya fungsi bawaan.
select myfunc("abc");Informasi berikut dikembalikan:OK abc:HelloWorld