Hive UDF UDTF 实现与使用

用户自定义函数

1 UDF函数的创建 一进一出

1 添加maven依赖

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-exec -->
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-exec</artifactId>
            <version>3.1.2</version>
        </dependency>
    </dependencies>

2 实现类

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;

/***
 *  @description  UDF函数的定义使用
 *  @author caoyongfei
 *
 */
public class MyStringLength extends GenericUDF {
    /**
     * @param objectInspectors 输入参数的鉴别器对象
     * @return 返回值类型的鉴别器对象
     * @throws UDFArgumentException
     */
    public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {
        if (objectInspectors.length != 1)
            throw new UDFArgumentLengthException("Input Args Length Error");
        if (!objectInspectors[0].getCategory().equals(ObjectInspector.Category.PRIMITIVE)) {
            throw new UDFArgumentTypeException(0, "Input Args Type Error !");
        }
        //返回int类型的鉴别器对象
        return PrimitiveObjectInspectorFactory.javaIntObjectInspector;
    }

    /**
     *  函数的逻辑处理
     * @param deferredObjects 输入的参数
     * @return  返回值
     * @throws HiveException
     */
    public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {
        if(deferredObjects[0].get() == null)
            return 0;
        return deferredObjects[0].get().toString().length();
    }

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

3 打jar包上传到服务器上

rz xxx

4 添加jar包

add jar /opt/module/data/udf.jar;

在这里插入图片描述

5 创建函数关联jar包中的函数实现类

create temporary function my_len as "MyStringLength"

在这里插入图片描述

6 使用自定义函数

在这里插入图片描述

2 UDTF函数的创建使用 一进多出

1 实现代码

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;

/***
 *  @description 自定义UDTF函数
 *  @author caoyongfei
 *
 */
public class MyUDTF extends GenericUDTF {

    private ArrayList<String> outList = new ArrayList<String>();
    @Override
    public StructObjectInspector initialize(ObjectInspector[] argOIs) throws UDFArgumentException {
        //1、定义输出数据的列明和类型
        List<String> fieldNames = new ArrayList();
        List<ObjectInspector> filedOIs = new ArrayList();

        //2、添加输出数据的列明和类型
        fieldNames.add("lineToWord");
        filedOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);

        return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames,filedOIs);
    }

    public void process(Object[] objects) throws HiveException {
        //1、获取原始数据
        String arg = objects[0].toString();
        //2、获取数据传入的第二个参数,此处为分隔符
        String splitKey = objects[1].toString();
        //3、将原始数据按照分隔符进行分割
        String[] fields = arg.split(splitKey);
        //4、遍历切分后的结果,并写出内容


        for (String field : fields) {
            outList.clear();//清空集合数据
            outList.add(field);
            forward(outList);//写出
        }
    }

    public void close() throws HiveException {

    }
}

2 打包上传服务器

3 添加jar包

add jar /opt/module/data/udtf.jar

4 创建函数关联jar包中的函数实现类

create function my_udtf as "MyUDTF";

5 使用自定义UDTF函数

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
UDTFUDFHive中的两种不同类型的函数。 UDTF(User-Defined Table-Generating Function)是用户自定义的表生成函数,用于在查询中生成表。UDTF函数在SELECT子句中使用,可以将一列或多列的输入数据转换为多个输出列,并生成一个新的表。UDTF函数通常用于将一列的值拆分成多个行,以实现行转列的效果。在Hive中,使用lateral view关键字来调用UDTF函数。\[1\] UDF(User-Defined Function)是用户自定义的函数,用于在查询中对数据进行转换和处理。UDF函数可以接受一个或多个输入参数,并返回一个值作为输出。UDF函数通常用于对单个数据项进行计算或转换。编写UDF函数需要继承两个类:org.apache.hadoop.hive.ql.udf.generic.AbstractGenericUDAFResolver和org.apache.hadoop.hive.ql.udf.generic.GenericUDAFEvaluator。\[2\] 举个例子,如果需要将一列的值拆分成多个行,可以使用UDTF函数。例如,使用lateral view和split_udtf函数可以实现行转列的效果: ``` select id, names, score from udtf_test lateral view split_udtf(name,',') temp as names; ``` 另外,如果只需要对单个数据项进行计算或转换,可以使用UDF函数。例如,使用add_udf函数可以将score列的值加上10: ``` select id, name, score, add_udf(score) as add_score from udf_test; ``` 总结来说,UDTF函数用于生成表,通常用于行转列的操作;而UDF函数用于对单个数据项进行计算或转换。 #### 引用[.reference_title] - *1* *3* [HiveUDFUDTF 、UDAF函数详解及示例](https://blog.csdn.net/qq_40579464/article/details/105903405)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [hive udf,udaf和udtf](https://blog.csdn.net/whdxkcx/article/details/107171065)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

yongfeicao

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

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

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

打赏作者

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

抵扣说明:

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

余额充值