Hive1.2开发MD5用户自定义函数UDF

因为公司使用的Hive版本是1.2,没有自带md5函数, 于是通过开发udf函数来实现该功能。我们使用IDEA和Maven来开发和构建。

创建项目

打开IntelliJ IDEA。
File => New => Project =>Maven =>勾选 Create from archetype => org.apache.maven.archetypes:maven-archetype-quickstart。
自己配置好groupId和artifactId。

开发编译

添加dependency

<dependency>
  <groupId>org.apache.hive</groupId>
  <artifactId>hive-exec</artifactId>
  <version>0.13.0</versioin>
</dependency>
<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-common</artifactId>
  <version>2.4.0</versioin>
</dependency>

编写代码

package com.company.udf;

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

import java.security.MessageDigest;

public class MD5 extends UDF {

    public String evaluate (final String str) {
        if (StringUtils.isBlank(str)){
            return "";
        }
        String digest = null;
        StringBuffer buffer = new StringBuffer();
        try {
            MessageDigest digester = MessageDigest.getInstance("md5");
            byte[] digestArray = digester.digest(str.getBytes("UTF-8"));
            for (int i = 0; i < digestArray.length; i++) {
                buffer.append(String.format("%02x", digestArray[i]));
            }
            digest = buffer.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return digest;
    }
}

测试MD5

可以在上面的类代码中添加如下代码:

public static void main (String[] args ) {
    MD5 md5 = new MD5();
    System.out.println(md5.evaluate("hello"));
}

编译打包

mvn clean package -DskipTests

注册到Hive

上传jar包到hdfs

在这之前,我们一般会把jar上传到Hive机器的本地文件系统,记住要使用二进制传输方式。如果使用的secureCRT的rz命令,默认为勾选ascii方式,需要取消这个选项。

我们可以用一下命令查看jar包中的类,不报错就说明上传没问题。

jar tf xxx.jar

使用如下命令上传到hdfs:

hadoop fs -put MD5.jar /tmp/udf/

将jar包添加到hive

后面的路径为jar包所在的绝对路径。

hive> add jar hdfs:///tmp/udf/MD5.jar

创建临时UDF

hive> create temporary function md5 as 'com.company.udf.MD5';

创建永久UDF

hive> create function md5 as 'com.company.udf.MD5' using jar 'hdfs:///tmp/udf/MD5.jar';

测试UDF

select md5('hadoop');
--结果: 3abb766da6c2c2d7739f3cb7799a4caa
--删除临时函数
DROP TEMPORARY FUNCTION [IF EXISTS] function_name;
--删除永久函数
DROP FUNCTION [IF EXISTS] function_name;
--重新加载函数 hive1.2.0之后支持
RELOAD FUNCTION;

原文来自个人CSDN:https://blog.csdn.net/weixin_36573294/article/details/107173859

上一篇:开启 控制文件自动备份下,参数文件、控制文件全部丢失恢复


下一篇:day04-使用PolarDB和ECS搭建门户网站