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