Java 实现生成MD5 UDF函数(用户自定义函数),供hive使用

背景:虽然 Hive 已经提供了很多内存的函数,但还是不能满足用户的需求,因此有提供了自定义函数供用户自己开发函数来满足自己的需求。

要求:用java实现 自定义的UDF函数md5_test,该函数用于生成MD5

效果如图:

一、java代码实现+包依赖(文件名和里面的class要一致

package cn.geek.bigdata.hive;

import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF;

import java.security.MessageDigest;

public class MD5Hash extends UDF {
    public String evaluate(String input) {
        if (StringUtils.isBlank(input)) {
            return "input is null";
        }
        String md5_value = null;
        StringBuffer buffer = new StringBuffer();
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] array = md.digest(input.getBytes("UTF8"));
            /* 方式 1 */
            for (byte item : array) {
                buffer.append(String.format("%02x", item)); // %02x 格式控制: 以十六进制输出,2为指定的输出字段的宽度.如果位数小于2,则左端补0
            }
            /* 方式 2 */
//            for (int i = 0; i < array.length; i++) {
//                buffer.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1, 3));
//            }

            md5_value = buffer.toString().toUpperCase();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return md5_value;
    }

    public static void main(String[] args) {
        MD5Hash md5 = new MD5Hash();
        String md5_value = md5.evaluate("input is null");
        System.out.println(md5_value);
    }
}

 # 配置包,maven依赖,pom.xml <dependencies> </dependencies>里添加以下 

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

二、生成jar包+上传服务器

        /home/student2/jean/MD5Hash.jar

三、进入hive命令行,生成funtion

        PS: 此处要注意,临时加入函数后,用show functions; 

        可以看到加入的函数是md5,

        而永久加入的函数看到的是default.md5,

        如果在其他数据库中执行加入函数操作,则函数名就是别的db.md5

 1、临时MD5Hash函数

# 临时加入该函数(该路径是Linux上文件路径,不是hdfs路径)
hive # 进入hive shell
add jar /home/student2/jean/MD5Hash.jar; 
create temporary function md5_test as 'cn.geek.bigdata.hive.MD5Hash';  # MD5Hash.class的全路径 踩坑:名字不能跟hive原生的md5 名字一样

# 删除临时function
drop temporary function if exists md5_test;

通过show functions;可以看到md5_test 已经加到hive里,(md5是hive原生的方法)

2、永久加入MD5Hash函数

# 首先得把jar包放到hdfs上
hadoop fs -mkdir /jar-file
hadoop fs -put MD5Hash.jar /jar-file
# 在hive里执行
create function md5_test as 'cn.geek.bigdata.hive.MD5Hash' using jar 'hdfs:///jar-file/MD5Hash.jar';

踩坑点:名字不能跟hive原生的md5 名字一样,换个名字就ok了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值