6.Hadoop面试系列之UDF


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

文章作者: Leon
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Leon !
评论
 上一篇
HiveSQL优化 hive参数版总结 HiveSQL优化 hive参数版总结
Hive SQL基本上适用大数据领域离线数据处理的大部分场景。Hive SQL的优化也是我们必须掌握的技能,而且,面试一定会问。那么,我希望面试者能答出其中的80%优化点,在这个问题上才算过关。 1. Hive优化目标 在有限的资源下,
2020-06-11
下一篇 
Hive开窗函数梳理 Hive开窗函数梳理
本文通过几个实际的查询例子,为大家介绍Hive SQL面试中最常问到的窗口函数。 假设有如下表格(loan)。表中包含贷款人的唯一标识,贷款日期,以及贷款金额。 1.SUM(), MIN(),MAX(),AVG()等聚合函数,可以直接使用
2020-06-10
  目录