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

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

因为公司使用的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

相关文章
|
8天前
|
SQL Java 数据处理
【Hive】Hive的函数:UDF、UDAF、UDTF的区别?
【4月更文挑战第17天】【Hive】Hive的函数:UDF、UDAF、UDTF的区别?
|
2月前
|
SQL 消息中间件 Apache
Flink报错问题之使用hive udf函数报错如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
|
3月前
|
SQL 搜索推荐 Java
Hive中的UDF是什么?请解释其作用和使用方法。
Hive中的UDF是什么?请解释其作用和使用方法。
37 0
|
4月前
|
SQL 分布式计算 Java
Hive自定义函数UDF编写
Hive自定义函数UDF编写
35 2
|
6月前
|
SQL 分布式计算 Java
阿里云MaxCompute-Hive UDF(Java)迁移上云实践
阿里云MaxCompute-Hive UDF(Java)迁移上云实践
|
6月前
|
SQL 分布式计算 Java
浅析 hive udf 的正确编写和使用方式- 论姿势的重要性 - 系列三 - hdfs 相对路径与静态代码块引起的问题
浅析 hive udf 的正确编写和使用方式- 论姿势的重要性 - 系列三 - hdfs 相对路径与静态代码块引起的问题
|
6月前
|
SQL 分布式计算 Java
如何在 hive udf 中访问配置数据-踩坑记录,方案汇总与对比-udf中可以写sql吗?
如何在 hive udf 中访问配置数据-踩坑记录,方案汇总与对比-udf中可以写sql吗?
|
9月前
|
SQL Java Maven
Hive UDF开发流程到调用
Hive UDF开发流程到调用
88 0
|
10月前
|
SQL Java 数据库
hive添加永久udf方法
hive添加永久udf方法
74 0
|
10月前
|
SQL XML Java