hive udf

1)创建一个Maven工程Hive

2)导入依赖

<dependencies>

        <dependency>

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

            <artifactId>hive-exec</artifactId>

            <version>3.1.2</version>

        </dependency>

</dependencies>

3创建一个类

package com.test.hive;

 

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 MyStringLength extends GenericUDF {

    /**

     *

     * @param arguments 输入参数类型的鉴别器对象

     * @return 返回值类型的鉴别器对象

     * @throws UDFArgumentException

     */

    @Override

    public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {

        // 判断输入参数的个数

        if(arguments.length !=1){

            throw new UDFArgumentLengthException("Input Args Length Error!!!");

        }

        // 判断输入参数的类型

        if(!arguments[0].getCategory().equals(ObjectInspector.Category.PRIMITIVE)){

            throw new UDFArgumentTypeException(0,"Input Args Type Error!!!");

        }

        //函数本身返回值为int,需要返回int类型的鉴别器对象

        return PrimitiveObjectInspectorFactory.javaIntObjectInspector;

    }

 

    /**

     * 函数的逻辑处理

     * @param arguments 输入的参数

     * @return 返回值

     * @throws HiveException

     */

    @Override

    public Object evaluate(DeferredObject[] arguments) throws HiveException {

       if(arguments[0].get() == null){

           return 0 ;

       }

       return arguments[0].get().toString().length();

    }

 

    @Override

    public String getDisplayString(String[] children) {

        return "";

    }

}

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

5jar包添加到hiveclasspath

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

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

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

7即可在hql中使用自定义的函数 

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

posted @   执牛耳与君行  阅读(68)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示