UDF简称自定义函数,它是Hive函数库的扩展,自定义函数UDF在MapReduce执行阶段发挥作用。开发步骤如下:
1) 给hive.ql.exec.UDF包开发一个自定义函数类,从UDF继承。自定义函数类实现evaluate方法。
2) 在FunctionRegistry类中注册开发的自定义函数类。
3) 打包发布至Hive客户端。
Eclipse是一款开源的、基于Java的可扩展开发平台。Hadoop开发人员可通过在Eclipse上面开发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客户端。
函数清单及其功能
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) |
验证身份证合法性 |
Ø 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