作者:翁松秀
用Java实现Hive的UDF非常简单,只需要编写Java代码,打包成JAR包,最后在Hive中注册就可以使用。
以下6个步骤实现了从编写UDF代码,到注册Hive函数,只需要6个步骤就可以在开发当中使用我们的自己编写的UDF。
亲测有效!!!
Java编写Hive的UDF代码很简单,只需要做两件事:
第一,继承UDF类。
第二,实现evaluate( )方法,UDF实现的功能在evaluate里实现。Hive根据类名来创建UDF,调用的时候根据evaluate参数来调用不同的方法,实现不同的功能。
package mastercom.hive.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ZodiacUDF extends UDF {
private SimpleDateFormat df;
private static final String[] zodiacArr = { "猴", "鸡", "狗", "猪", "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊" };
public ZodiacUDF() {
df = new SimpleDateFormat("yyyy-MM-dd");
}
/**
* 继承类UDF中的evaluate()函数
*
* @param date
* @return
*/
public String evaluate(String date) {
Date dt = null;
try {
dt = df.parse(date);
} catch (Exception ex) {
return null;
}
return this.zodiac(dt.getYear() + 1900);
}
/**
* 计算生肖
*
* @param year
* @return
*/
private String zodiac(Integer year) {
return zodiacArr[year % 12];
}
public static void main(String[] args) {
ZodiacUDF zf = new ZodiacUDF();
System.out.println(zf.evaluate("1996-4-27"));
}
}
对于Maven工程,右键工程→Run As→Maven install,就可以在工程目录下的target文件夹看到打包好的JAR包,将JAR包传到集群。
我的JAR包路径是/home/data/HiveUDF.jar。
hive> add jar /home/data/HiveUDF.jar;
hive> create temporary function zodiac as 'mastercom.hive.udf.ZodiacUDF';
创建函数需要注意:
mastercom.hive.udf.ZodiacUDF是包名+类名,比如我的包名mastercom.hive.udf,类名ZodiacUDF。
hive> select zodiac("1996-4-27");
OK
鼠
Time taken: 0.205 seconds, Fetched: 1 row(s)
在实际开发当中需要将我们编写的UDF永久注册到Hive里,一次编写,永久使用。注册过程也很简单:
create function hive.zodiac as 'mastercom.hive.udf.ZodiacUDF' using jar 'hdfs://192.168.1.101:8020/script/HiveUDF.jar';
hive 0.13版本以后(包过0.13)是支持注册永久函数的,而且提供了注册的方法。在永久注册函数的时候需要指定数据库,这里我指定的是hive数据库。
显示以下信息表示执行成功:
hive>create function hive.zodiac as 'mastercom.hive.udf.ZodiacUDF' using jar 'hdfs://192.168.1.101:8020/script/HiveUDF.jar';
converting to local hdfs://192.168.1.101:8020/script/HiveUDF.jar
Added [/tmp/a5970c72-edd6-4bf8-b694-2c331c07335e_resources/HiveUDF.jar] to class path
Added resources: [hdfs://192.168.1.101:8020/script/HiveUDF.jar]
OK
Time taken: 0.095 seconds
hive>drop function zodiac;
OK
Time taken: 0.004 seconds