Hive自定义UDF函数实现

1、UDF定义

UDF:User-Defined-Function 自定义函数 、一进一出;

2、背景

  • 系统内置函数无法解决实际的业务问题,需要开发者自己编写函数实现自身的业务实现诉求。

  • 应用场景非常多,面临的业务不同导致个性化实现很多,故udf很需要。

  • 意义

    • 函数扩展得到解决,极大丰富了可定制化的业务需求。
    • IO要求-要解决的问题
      • in:out=1:1,只能输入一条记录当中的数据,同时返回一条处理结果。
      • 属于最常见的自定义函数,像cos,sin,substring,indexof等均是如此要求

    3、实现步骤

    • 自定义一个java类
    • 继承UDF类
    • 重写evaluate方法
    • 打包类所在项目成一个all-in-one的jar包并上传到hive所在机器
    • 在hive中执行add jar操作,将jar加载到classpath中。
    • 在hive中创建模板函数,使得后边可以使用该函数名称调用实际的udf函数
    • hive sql中像调用系统函数一样使用udf函数

    4、代码实现示例

    • 功能要求:实现当输入字符串超过2个字符的时候,多余的字符以”…”来表示。
    • 如“12”则返回“12”,如“123”返回“12…”
    • 自定义类、继承UDF、重写evaluate方法已在代码中体现

    依赖包:

    compileOnly('org.apache.hive:hive-exec:1.1.0-cdh5.14.0')
    

    核心实现代码:

    import org.apache.hadoop.hive.ql.exec.UDF;
    /*
     * 功能:实现当输入字符串超过2个字符的时候,多余的字符以"..."来表示。
     * 输入/输出:* 如“12”则返回“12”,如“123”返回“12..."
     */
    public class ValueMaskUDF extends UDF{
           public String evaluate(String input,int maxSaveStringLength,String replaceSign) {
                 if(input.length()<=maxSaveStringLength){
                        return input;
                 }
                 return input.substring(0,maxSaveStringLength)+replaceSign;
           }
           public static void main(String[] args) {
                 System.out.println(new ValueMaskUDF().evaluate("河北省",2,"..."));;
           }
    }
    

    5、永久添加 UDF

    不能是本地 jar 包,需要上传 jar 包到 hdfs 目录中:

hadoop fs -put hive-udf-1.0-SNAPSHOT.jar /user/hive/jars

然后进入 hive 中,创建函数:

hive> create function myCount as 'cn.com.xxx.udf.ValueMaskUDF' using jar 'hdfs:/user/hive/jars/hive-udf-1.0-SNAPSHOT.jar';
OK

6、参考资料

1.《Hive 编程指南》

你可能感兴趣的:(Hive自定义UDF函数实现)