HIVE编写MD5加密UDF函数
HIVE本身提供的函数并不丰富,当提供的函数不能满足业务场景需求时,可以使用自定义函数。
HIVE有三种类型的自定义函数:
- UDF(User-Defined-Function) 一进一出
- UDAF(User- Defined Aggregation Funcation) 聚合函数,多进一出。Count/max/min
- UDTF(User-Defined Table-Generating Functions) 一进多出,如lateral view/explore
近来有个业务需要对某个字段进行脱敏,选择了MD5的加密方式,HIVE内部没有MD5加密的函数,于是决定用自定义函数实现。
HIVE实现自定义函数方法的步骤:
- 编写函数
- 打包上传
- 创建函数
一、编写函数
用maven写的UDF函数,maven创建项目:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xIS8Znpa-1604714305162)(D:\Documents\markdown\pic\IDEA创建maven项目.JPG)]
poxm.xml配置文件如下:
<properties>
<!--更改成自己的版本-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<hive.version>1.2.1</hive.version>
<hadoop.version>2.6.4</hadoop.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--添加hadoop依赖-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>${hadoop.version}</version>
</dependency>
<!--添加hive依赖-->
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>${hive.version}</version>
</dependency>
</dependencies>
开始编写UDF函数:
package com.cn;
import org.apache.hadoop.hive.ql.exec.UDF;
import java.security.MessageDigest;
/**
* @program: md5_encry
* @description: MD5加密
* @author: xx
* @create: 2020-10-17 22:21
*/
//继承UDf类
public class MD5EncryptUDF extends UDF {
private static final char[] DIGITS = { '0', '1', '2', '3', '4', '5', '6',
'7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
/**
* @description:
* @param input
* @return: org.apache.hadoop.io.Text
* @author: xx
* @time: 2020/10/17 22:32
*/
//重写evaluate
public String evaluate(String input){
if(input == null) return null;
MessageDigest digester = null;
byte[] digestArray = null;
try {
digester = MessageDigest.getInstance("md5");
digestArray = digester.digest(input.getBytes("UTF-8"));
} catch (Exception e) {
e.printStackTrace();
}
return new String(encodeHex(digestArray));
}
private static char[] encodeHex(byte[] data) {
int l = data.length;
char[] out = new char[l << 1];
for (int i = 0, j = 0; i < l; i++) {
out[j++] = DIGITS[(0xF0 & data[i]) >>> 4];
out[j++] = DIGITS[0x0F & data[i]];
}
return out;
}
}
编写完后测试正常,即可打包
二、打包上传
两种上传方式,一种
- 上传到要使用该函数的hive shell所在机器的本地路径;
- 上传到hdfs;
若只是临时在某台机器使用随便两种方式都行,若要所有机器都能使用或者要永久注册则需要上传到hdfs
临时注册
在hiveshell下输入:
add jar /home/hive/udfs/md5_encry-1.0-SNAPSHOT.jar;
create temporary function md5 as 'com.cn.MD5EncryptUDF';
创建完以后就可以使用了,不过只对当前会话有效,并且只能在本台机器使用,若想在其他机器上使用,上传到hdfs,然后在使用的机器上hiveshell时填写hdfs路径即可
永久注册
注意使用永久注册,要用权限足够大的linux用户,要不然无法生效
将jar包上传hdfs:
hdfs dfs -put /home/hive/udfs/md5_encry-1.0-SNAPSHOT.jar /user/jar/
在hiveshell下输入:
CREATE FUNCTION md5 AS 'com.cn.MD5EncryptUDF' USING JAR 'hdfs://nameservice:8020/user/jar/md5_encry-1.0-SNAPSHOT.jar';
创建成功后,可在所有机器正常使用