背景:虽然 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';