【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、导入依赖

<dependencies>

<dependency>

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

<artifactId>hive-exec</artifactId>

<version>3.1.2</version>

</dependency>

</dependencies>

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 "";

}

}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值