Java编写Hive的UDF

作者:翁松秀


文章目录

    • 一、Java编写UDF代码
    • 二、将Java代码打包成JAR包
    • 三、在Hive中添加JAR包
    • 四、创建临时函数
    • 五、进行查询测试
    • 六、永久注册UDF到Hive
    • 七、注销函数

前言:

用Java实现Hive的UDF非常简单,只需要编写Java代码,打包成JAR包,最后在Hive中注册就可以使用。

以下6个步骤实现了从编写UDF代码,到注册Hive函数,只需要6个步骤就可以在开发当中使用我们的自己编写的UDF。

亲测有效!!!

一、Java编写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"));
	}
}

二、将Java代码打包成JAR包

对于Maven工程,右键工程→Run As→Maven install,就可以在工程目录下的target文件夹看到打包好的JAR包,将JAR包传到集群。
我的JAR包路径是/home/data/HiveUDF.jar。

三、在Hive中添加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。
Java编写Hive的UDF_第1张图片

五、进行查询测试

hive> select zodiac("1996-4-27");
OK
鼠
Time taken: 0.205 seconds, Fetched: 1 row(s)

六、永久注册UDF到Hive

在实际开发当中需要将我们编写的UDF永久注册到Hive里,一次编写,永久使用。注册过程也很简单:

  1. 将JAR包上传到HDFS,我的JAR包上传到了hdfs://192.168.1.101:8020/script/HiveUDF.jar。
  2. 在Hive中永久注册UDF
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

你可能感兴趣的:(Hive)