Hive自定义函数

自定义UDF函数

0)需求:

自定义一个UDF实现计算给定字符串的长度,例如:

hive(default)> select my_len("abcd");

4

1)创建一个Maven工程Hive

2)导入依赖

<dependencies>

        <dependency>

           <groupId>org.apache.hive</groupId>

           <artifactId>hive-exec</artifactId>

           <version>3.1.2</version>

        </dependency>

</dependencies>

3创建一个类

import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;

/**
 * 自定义UDF函数,需要继承GenericUDF类
 * 需求: 计算指定字符串的长度
 */
public class MyLength extends GenericUDF {
    /**
     * 初始化方法,里面要做三件事
     * 1.约束函数传入参数的个数
     * 2.约束函数传入参数的类型
     * 3.约束函数返回值的类型
     * @param arguments  函数传入参数的类型
     * @return
     * @throws UDFArgumentException
     */
    @Override
    public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
        //1.约束函数传入参数的个数
        if (arguments.length != 1) {
            throw new UDFArgumentLengthException("Input Args Num Error,You can only input one arg...");
        }
        //2.约束函数传入参数的类型
        if (!arguments[0].getCategory().equals(ObjectInspector.Category.PRIMITIVE)) {
            throw new UDFArgumentTypeException(0,"Input Args Type Error,You can only input PRIMITIVE Type...");
        }
        //3.约束函数返回值的类型
        return PrimitiveObjectInspectorFactory.javaIntObjectInspector;
    }

    /**
     * 函数逻辑处理方法
     * @param arguments  函数传入参数的值
     * @return
     * @throws HiveException
     */
    @Override
    public Object evaluate(DeferredObject[] arguments) throws HiveException {
        //获取函数传入参数的值
        Object o = arguments[0].get();
        //将object转换成字符串
        int length = o.toString().length();
        //因为在上面的初始化方法里面已经对函数返回值类型做了约束,必须返回一个int类型
        //所以我们要在这个地方直接返回length
        return length;
    }

    /**
     * 返回显示字符串方法,这个方法不用管,直接返回一个空字符串
     * @param children
     * @return
     */
    @Override
    public String getDisplayString(String[] children) {
        return "";
    }
}

 

 

4创建临时函数

1打成jar包上传到服务器/opt/module/hive/datas/myudf.jar

2jar包添加到hiveclasspath,临时生效

hive (default)> add jar /opt/module/hive/datas/myudf.jar;

(3)创建临时函数与开发好的java class关联

hive (default)> create temporary function my_len as "com.atguigu.hive.MyStringLength";

4即可在hql中使用自定义的临时函数

hive (default)> select ename,my_len(ename) ename_len from emp;

        5)删除临时函数

hive (default)> drop  temporary function my_len;

        注意:临时函数只跟会话有关系,跟库没有关系。只要创建临时函数的会话不断,在当前会话下,任意一个库都可以使用,其他会话全都不能使用。

5)创建永久函数 方式一

        1)在$HIVE_HOME下面创建auxlib目录

[atguigu@hadoop102 hive]$ mkdir auxlib

        2)将jar包上传到$HIVE_HOME/auxlib下,然后重启hive

3创建永久函数

hive (default)> create function my_len2 as "com.atguigu.hive.MyStringLength";

(4)即可在hql中使用自定义的永久函数 

hive (default)> select ename,my_len2(ename) ename_len from emp;

5删除永久函数 

hive (default)> drop function my_len2;

5)创建永久函数 方式二

 

注意:因为永久函数是永久生效的,我们推出当前会话以后,其他会话也要使用永久函数,因此我们就不能简单的使用add jar来添加hive的类路径了

创建永久函数

注意:此时要使用USING JAR的方式来添加函数的jar包类路径,并且这个路径必须是hdfs路径

create function my_len2 as "com.atguigu.hive.udf.MyStringLength" USING JAR 'hdfs://hadoop102:9820/hivejar/myudf.jar';

删除永久函数

drop function my_len2;

注意:永久函数跟会话没有关系,创建函数的会话断了以后,其他会话也可以使用。

永久函数创建的时候,在函数名之前需要自己加上库名,如果不指定库名的话,会默认把当前库的库名给加上。

永久函数使用的时候,需要在指定的库里面操作,或者在其他库里面使用的话加上 库名.函数名

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值