• 【Hive】Hive怎么写自定义函数(UDF、UDTF、UDAF)


    步骤

    1、继承 Hive 提供的类
    org.apache.hadoop.hive.ql.udf.generic.GenericUDF
    org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
    2、 实现类中的抽象方法
    3、在 hive 的命令行窗口创建函数
    添加 jar :add jar linux_jar_path
    创建 function :create [temporary] function [dbname.]function_name AS class_name;
    4、在 hive 的命令行窗口删除函数
    drop [temporary] function [if exists] [dbname.]function_name;

    自定义UDF函数

    1、创建一个 Maven工程:Hive

    2、导入依赖

    org.apache.hive

    hive-exec

    3.1.2

    3、创建一个类

    package com.atguigu.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.PrimitiveObjectIn

    spectorFactory;

    /**

    *自定义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 TypeError!!!");

    }

      //函数本身返回值为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 "";

    }

    }

     

  • 相关阅读:
    在C++中加上using namespace std; 和不加上有什么区别
    Kotlin设计模式:深入理解桥接模式
    C语言基础
    MSDC 4.3 接口规范(4)
    2 Zookeeper 单击安装
    MySQL进阶实战9,InnoDB和MyISAM的数据分布对比
    Git 小技巧:忽略某些文件的更改
    【CNN】白话迁移学习中域适应
    Hadoop2复安装过程详细步骤
    Spring注解@Transactional是什么?具体的使用方法
  • 原文地址:https://blog.csdn.net/m0_65025800/article/details/126558381