hive中自定义UDT,UDTF函数

自定函数

**** 自定义函数

1.Hive 自带了一些函数,比如:max/min 等,但是数量有限,自己可以通过自定义 UDF 来

方便的扩展。

2.当 Hive 提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义

函数(UDF:user-defined function)。

3根据用户自定义函数类别分为以下三种:

(1)UDF(User-Defined-Function)

一进一出

(2)UDAF(User-Defined Aggregation Function)

聚集函数,多进一出

类似于:count/max/min

(3)UDTF(User-Defined Table-Generating Functions)

一进多出

如 lateral view explode()

1.使用idea自定义UDF函数

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

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

1.创建maven工程

2.导入依赖

<dependencies>
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-exec</artifactId>
            <version>3.1.2</version>
        </dependency>
    </dependencies>

2.创建一个UDF类继承 GenericUDF 重写方法

package com.lhh.udf;

import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
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;

/**
 * @program: hive-api
 * @description:
 * @author: 华仔
 * @create: 2021-03-25 22:43
 */
//自定义 myudf
public class MyUDF extends GenericUDF {

    //初始化 校验数据参数个数
    public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {
        if (objectInspectors.length != 1) {
            throw new UDFArgumentException("参数个数不为1");
        }
        return PrimitiveObjectInspectorFactory.javaIntObjectInspector;
    }

    //计算 处理数据
    public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {
        ///取出数据
        String input = deferredObjects[0].get().toString();
        //判断数据是否为null
        if (input == null) {
            return 0;
        }
        //返回输入数据的长度
//        return input.toUpperCase();//转大写
//        return input.toLowerCase();//转小写
        return input.length();
    }

    public String getDisplayString(String[] strings) {
        return "";
    }
}

2.自定义 UDTF 函数

1.需求

自定义一个 UDTF 实现将一个任意分割符的字符串切割成独立的单词,例如

hive(default)> select myudtf("hello,world,hadoop,hive", ",");
hello
world
hadoop
hive

2.代码实现

package com.lhh.udf;

import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;

import java.util.ArrayList;
import java.util.List;

/**
 * @program: hive-api
 * @description:
 * @author: 华仔
 * @create: 2021-03-25 23:23
 */
//自定义myudtf

/**
 * 输入数据: hello,atguigu,hive (stirng类型)
 * 输出数据 :
 * hello
 * atuigu
 * hive
 */
public class MyUDTF extends GenericUDTF {
    //输出数据的集合
    private ArrayList<String> Output = new ArrayList<String>();

    //初始化 校验数据参数个数
    public StructObjectInspector initialize(ObjectInspector[] args) throws UDFArgumentException {
        //输出数据的默认列名,可以被别名覆盖
        List<String> fieldNames = new ArrayList<String>();
        fieldNames.add("word");
        //输出数据的类型
        List<ObjectInspector> fieldOIs = new ArrayList<ObjectInspector>();
        fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
        return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);
    }

    //处理输入数据
    public void process(Object[] objects) throws HiveException {
        //第一步取出输入数据
        String input = objects[0].toString();
        //取出自己定义的分隔符 select my_udtf(name,',') 
        String s1 = objects[1].toString();
        //按分割符拆分
        String[] split = input.split(s1);
        for (String s : split) {
            //清空集合
            Output.clear();
            //将数据添加到集合
            Output.add(s);
            //输出数据
            forward(Output);
        }
    }

    //首尾方法
    public void close() throws HiveException {

    }
}
3.在hive中使用自定义方法

1.将工程导成jar包放到 /opt/module/hive/lib/ 下面去

2.添加jar包

add jar /opt/module/hive/data/hive-demo-1.0-SNAPSHOT.jar;

3.为稳妥,直接ctrl +c 先退出一波

4.重新进来创建自定函数

 --UDF
 create temporary function my_len as 
"com.lhh.udf.MyUDF";

--UDTF
 create temporary function my_udtf as 
"com.lhh.udf.MUDTF";

5.使用自定义函数

--UDF  计算长度
SELECT my_len('lhhhuazi') from test;
--UDTF
SELECT MY_UDTF(words,',') from test;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热心市民爱抽烟屁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值