1. 开发步骤
UDF简称自定义函数,它是Hive函数库的扩展,自定义函数UDF在MapReduce执行阶段发挥作用。开发步骤如下:
1) 给hive.ql.exec.UDF包开发一个自定义函数类,从UDF继承。自定义函数类实现evaluate方法。
2) 在FunctionRegistry类中注册开发的自定义函数类。
3) 打包发布至Hive客户端。
1.1 开发工具
Eclipse是一款开源的、基于Java的可扩展开发平台。Hadoop开发人员可通过在Eclipse上面开发UDF。
1.2 UDF函数案例
1)开发UDF函数类
文件名及路径:/hive-0.12.0/src/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFHelloWorld.java
package org.apache.hadoop.hive.ql.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
public class UDFHelloWorld extends UDF {
public String evaluate(String str) {
if (str == null) {
return null;
}
return "HelloWorld " + str;
}
public static void main(String[] args) {
helloUDF uf = new helloUDF();//Text t = new Text("gfsg");
System.out.println(uf.evaluate("nihao").toString());
}
}
2)UDF类注册,注册方法
文件名及路径:/hive-0.12.0/src/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
package org.apache.hadoop.hive.ql.exec;
import org.apache.hadoop.hive.ql.udf.UDFHelloWorld;/*** FunctionRegistry.*/
public final class FunctionRegistry {
static {
registerGenericUDF("concat", GenericUDFConcat.class);
registerUDF("substr", UDFSubstr.class, false);
registerUDF("substring", UDFSubstr.class, false);
registerUDF("space", UDFSpace.class, false);
registerUDF("repeat", UDFRepeat.class, false);
registerUDF("ascii", UDFAscii.class, false);
registerUDF("lpad", UDFLpad.class, false);
registerUDF("rpad", UDFRpad.class, false);
registerUDF("Hello", UDFHelloWorld.class, false);
registerGenericUDF("size", GenericUDFSize.class);
3)Jar包发布路径
发布路径:/opt/boh/hive/lib/hive-exec-0.12.0-cdh5.0.0.jar
上传至hadoop集群执行脚本的hive客户端。
1.3Hive UDF函数
1.3.1UDF函数列表
- 函数清单及其功能
TO_DATE(string date,'format')
- 格式化所需要的日期
ADD_MONTHS(Timestamp date,int n)
- 增加月数
date_tostring(Timestamp date,'format')
- 转换Date类型为指定格式字符串
MONTHS_BETWEEN(Timestamp date1,Timestamp date2)
- 返回两个日期之间的月数
f_age(string identityId)
- 验证身份证合法性并返回性别年龄
f_checkidcard(string identityId)
- 验证身份证合法性
1.3.2 UDF函数说明
- TO_DATE函数
Select to_date('20140909111111','YYYYMMDDHH24miss') from test;
返回结果:2014-09-09 11:11:11
- ADD_MONTHS函数
select add_months(to_date('20140909111111','YYYYMMDDHH24miss'),1) from test;
返回结果:2014-10-09 11:11:11
- date_tostring函数
select date_tostring(to_date('20140909111111','YYYYMMDDHH24miss'),'YYYY-MM-DD') from test;
返回结果:2014-09-09
- MONTHS_BETWEEN函数
select MONTHS_BETWEEN(to_date('20140909111111','YYYYMMDDHH24miss'),to_date('20140706111111','YYYYMMDDHH24miss')) from test;
返回结果:2.096774193548387
- f_age函数
select f_age('511024198710148199') from test;
返回结果:127
- f_checkidcard函数
select f_checkidcard('511024198710148199') from test;
返回结果:1