本文目的为告诉读者在如何通过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