HIVE创建UDF函数全流程

今天做一期分享Hive的UDF函数和使用的的整个过程

场景

业务需求,想要实现姓名的脱敏
一个字的姓名,提示“单字姓名无法映射”
两个字的,加密后一位,例如:张三,张*
三个字及以上的保留第一位和最后一位

针对此场景一个好的udf实现,即可万事大吉

建立Maven工程

pom文件导入必要依赖hive-exec和hive-common,我的是Hive3.1.2,请根据自己的HIve版本导入依赖,具找依赖可以到以下链接找寻
Maven Repository
以下为我的pom文件的依赖

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

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

编写Java代码,继承GenericUDF类,重写initialize、evaluate、getDisplayString三个方法
以下是我的Java代码,定义了一个JiamiFunction类

package com.brilliance;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
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;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.StringObjectInspector;

/**
 * @author chad
 * @since 2025/8/25
 */
public class JiamiFunction extends GenericUDF{
    private StringObjectInspector stringInspector;

    @Override
    public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
        if (arguments.length != 1) {
            throw new UDFArgumentLengthException("该函数只接受1个参数");
        }
        stringInspector = (StringObjectInspector) arguments[0];
        return PrimitiveObjectInspectorFactory.javaStringObjectInspector;
    }

    @Override
    public Object evaluate(GenericUDF.DeferredObject[] arguments) throws HiveException {
        String name = stringInspector.getPrimitiveJavaObject(arguments[0].get());
        if (name == null || name.trim().isEmpty()) {
            return "数据为空无法映射";
        }

        name = name.trim();
        if (!name.matches("^[\u4e00-\u9fa5]+$")) {
            return "非汉字姓名无法处理";
        }

        int length = name.length();
        if (length == 1) {
            return "单字姓名无法映射";
        } else if (length == 2) {
            return name.charAt(0) + "*";
        } else {
            return name.charAt(0) + "**" + name.charAt(length - 1);
        }
    }

    @Override
    public String getDisplayString(String[] children) {
        return "姓名脱敏函数";
    }
}

写完这个类之后,就可以打包了,点击打包,生成一个jar包
在这里插入图片描述
上传jar包到hdfs,随便放到一个目录,我的放在以下位置
在这里插入图片描述

Hive中函数注册及使用

在Hive中执行以下命令
加载jar包

add jar hdfs:///udfs/jiami.jar;

创建函数

CREATE FUNCTION day02_hive.to_namejiami
    AS 'com.brilliance.JiamiFunction'
    USING JAR 'hdfs:///udfs/jiami.jar';

效果展示,我的Hive中创建了一张表hero,其中有一列为name,查询如下
在这里插入图片描述
使用我刚才创建的udf函数后

select name,
       to_namejiami(name)
from hero;

在这里插入图片描述
效果实现,希望我的分享可以帮助到你

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

chad__chang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值