手把手教你定义一个UDF

本文目的为告诉读者在如何通过java实现一个UDF—>在linux下如何将该UDF打包成一个jar—>在hive中如何引入这个jar—>以及在此基础上定义函数。相信读者读完本文,一定可以自己实际定义任何所需的UDF。

 

废话不多少,直接看实例。

假设想定义一个能够根据人的生日来计算他的星座的函数。

步骤一:准备一份样例数据,我们将其写入文件bigdata.txt中,并放在某个路径下(例如:/home/test):

 edwardcapriolo,edward@media6degrees.com,2-12-1981,209.191.139.200,M,10

 bob,bob@test.net,10-10-2004,10.10.10.1,M,50

sara connor,sara@sky.net,4-5-1974,64.64.5.1,F,2

步骤2:定义一个表,并将文件中的数据导入到该表中:

hive > CREATE TABLE IF NOT EXISTS bigdata(
> name STRING,
> email STRING,
> bday STRING,
> ip STRING,
> gender STRING,
> anum INT)
> ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
hive> LOAD DATA LOCAL INPATH '/home/test/bigdata.txt'
> INTO TABLE bigdata;

步骤三:在某个路径下创建一个文件夹udf(我的是:/home/test/udf),然后再该路径下分别创建src,classes文件夹,其中src存放UDF对应的java实现代码,classes放置编译好的.class文件

步骤四:编写UDF对应的java实现,并将该文件保存在步骤三创建的src路径下:

package aturbo.com.hadoop;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.SimpleFormatter;

import org.apache.hadoop.hive.ql.exec.UDF;

public class UDFZodiacSign extends UDF {

	private SimpleDateFormat df;

	public UDFZodiacSign() {
		df = new SimpleDateFormat("MM-dd-yyyy");
	}

	public String evaluate(Date bday) {
		return this.evaluate(bday.getMonth(), bday.getDay());
	}

	public String evaluate(String bday) {
		Date date = null;
		try {
			date = df.parse(bday);
		} catch (Exception ex) {
			return null;
		}

		return this.evaluate(date.getMonth() + 1, date.getDay());
	}

	public String evaluate(Integer month, Integer day) {
		if (month == 1) {
			if (day < 20) {
				return "Capricorn";
			} else {
				return "Aquarius";
			}
		}
		if (month == 2) {
			if (day < 19) {
				return "Aquarius";
			} else {
				return "Pisces";
			}
		}
		/* ...other months here */
		return null;
	}

}
步骤五:编译步骤四的java代码。
 javac -cp ${HIVE_HOME}/lib/hive-exec-1.2.1.jar -d ./classes/ ./src/*.java 

步骤六:将编译好的.class打成jar包:

 jar -cvf udf.jar -C ./classes/ .
步骤七:在hive会话中将jar包导入classpath:

 hive> ADD JAR /full/path/to/zodiac.jar;
步骤八:创建一个使用这个java类的函数
   hive> CREATE TEMPORARY FUNCTION zodiac
> AS 'aturbo.com.hadoop.UDFZodiacSign';

步骤九:然后你就可以使用该函数了:

hive> select name,bday,zodiac(bday) from bigdata;
OK
edward capriolo	2-12-1981	Aquarius
bob	10-10-2004	NULL
sara connor	4-5-1974	NULL
Time taken: 1.522 seconds, Fetched: 3 row(s)


参考文献:

1.programming hive



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值