Topik ini menjelaskan cara menggunakan fungsi yang ditentukan pengguna (UDF) Hive yang kompatibel dengan MaxCompute pada klien MaxCompute.
Prasyarat
Klien MaxCompute harus sudah diinstal. Untuk informasi lebih lanjut, lihat Instal dan Konfigurasikan Klien MaxCompute.
Peringatan
Sebelum menggunakan Hive UDF, perhatikan hal-hal berikut:
Saat menjalankan perintah
ADD JARuntuk menambahkan paket sumber daya Hive UDF pada klien MaxCompute, Anda harus menentukan semua file JAR yang ingin ditambahkan karena MaxCompute tidak dapat secara otomatis menambahkan semua file JAR ke classpath.Untuk memanggil Hive UDF, tambahkan perintah
set odps.sql.hive.compatible=true;sebelum pernyataan SQL yang akan dijalankan. Kemudian, kirim dan jalankan perintah serta pernyataan SQL tersebut bersama-sama.Jika Java UDF dijalankan dalam lingkungan terdistribusi, UDF dibatasi oleh sandbox Java untuk MaxCompute. Untuk informasi lebih lanjut, lihat Java Sandbox.
UDF memulai proses baru untuk perhitungan. Jika sumber daya kluster tidak mencukupi, ada kemungkinan kecil bahwa UDF gagal berjalan karena waktu habis saat memulai proses baru.
Contoh kode
Contoh kode:
package com.aliyun.odps.compiler.hive;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class Collect extends GenericUDF {
@Override
public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {
if (objectInspectors.length == 0) {
throw new UDFArgumentException("Collect: input args should >= 1");
}
for (int i = 1; i < objectInspectors.length; i++) {
if (objectInspectors[i] != objectInspectors[0]) {
throw new UDFArgumentException("Collect: input oi should be the same for all args");
}
}
return ObjectInspectorFactory.getStandardListObjectInspector(objectInspectors[0]);
}
@Override
public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {
List<Object> objectList = new ArrayList<>(deferredObjects.length);
for (DeferredObject deferredObject : deferredObjects) {
objectList.add(deferredObject.get());
}
return objectList;
}
@Override
public String getDisplayString(String[] strings) {
return "Collect";
}
}Kode di atas mengemas sejumlah parameter acak dari tipe data apa pun ke dalam array. Dalam contoh ini, file JAR dari Hive UDF diberi nama test.jar.
Prosedur
Kemas contoh kode menjadi file JAR menggunakan Hive. Kemudian, jalankan perintah berikut untuk menambahkan file JAR sebagai sumber daya MaxCompute.
-- Tambahkan file JAR sebagai sumber daya MaxCompute. add jar test.jar;Untuk informasi lebih lanjut tentang cara menambahkan sumber daya, lihat Tambahkan Sumber Daya.
Jalankan perintah berikut untuk membuat UDF:
-- Buat UDF. create function hive_collect as 'com.aliyun.odps.compiler.hive.Collect' using 'test.jar';Untuk informasi lebih lanjut tentang cara membuat UDF, lihat Buat UDF.
Jalankan perintah berikut untuk memanggil UDF:
-- Aktifkan edisi tipe data yang kompatibel dengan Hive untuk proyek MaxCompute. set odps.sql.hive.compatible=true; -- Panggil UDF. select hive_collect(4y, 5y, 6y);Hasil berikut dikembalikan:
+------+ | _c0 | +------+ | [4, 5, 6] | +------+