hive自定义UDF函数

老API是继承UDF,编写evaluate方法,实现函数功能

案例:编写函数实现给定一个字符串,输出其长度。

注意:这里的evaluate方法的方法名不能写别的名字,只能写死

public class MyUDF extends UDF {

    public int evaluate(String input){
        if (input == null){
            return 0;
        }
        return input.length();
    }
}

 之后利用Maven将代码打包后上传到hive安装目录下的lib下边(可以选择重启hive,或者热添加的方式让jar包生效)

//热添加
add jar /opt/module/hive/lib/jar包包名;

之后编写函数,利用jar包里的类实现函数功能

create temporary function my_len as "com.hive.MyUDF"
//双引号引起来的是类的reference路径

函数编写后就可以在SQL语句中使用函数了。

例子:查询员工表的name字段的name字符长度

select 
    name,my_len(name)
from 
    emp;

新API

public class MyNewUDF extends GenericUDF{

    /**
     * 初始化方法:对输入的方法做检查,以及约束输出的类型
     * @param objectInspectors 输入参数的检查器
     * @return 输出的参数检查器
     * @throws UDFArgumentException
     */
    @Override
    public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {
        if(objectInspectors.length != 1){
            throw new UDFArgumentLengthException("Wrong Arguments Count!");
        }
        if (!objectInspectors[0].getCategory().equals(ObjectInspector.Category.PRIMITIVE)){
            throw new UDFArgumentException("Wrong Argument Type!");
        }
        //返回值的类型为int
        return PrimitiveObjectInspectorFactory.javaIntObjectInspector;
    }

    /**
     * 实现逻辑的方法
     * @param deferredObjects
     * @return
     * @throws HiveException
     */
    @Override
    public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {
        Object o = deferredObjects[0].get();
        if (o == null){
            return 0;
        }
        return o.toString().length();
    }

    /**
     * 如果方法的执行中出现了问题返回的字符串
     * @param strings
     * @return
     */
    @Override
    public String getDisplayString(String[] strings) {
        return "";
    }
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值