Hive函数入门--案例:UDF实现手机号加密--代码实现与效果演示
Posted kiritobryant
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive函数入门--案例:UDF实现手机号加密--代码实现与效果演示相关的知识,希望对你有一定的参考价值。
需求描述
在企业中处理数据的时候,对于敏感数据往往需要进行脱敏处理。比如手机号。我们常见的处理方式是将手机号中间4位进行****处理。
Hive中没有这样的函数可以直接实现功能,虽然可以通过各种函数的嵌套调用最终也能实现,但是效率不高,现要求自定义开发实现Hive函数,满足上述需求。
- 能够对输入数据进行非空判断、位数判断处理
- 能够实现校验手机号格式,把满足规则的进行****处理
- 对于不符合手机号规则的数据原封不动不处理
实现步骤
通过业务分析,可以发现我们需要实现的函数是一个输入一行输出一行的函数,也就是所说的UDF普通函数。
根据Hive当中的UDF开发规范,实现步骤如下:
- 写一个java类,继承UDF,并重载evaluate方法;
- 程序打成jar包,上传服务器添加到hive的classpath;
hive>add JAR /home/hadoop/udf.jar;
注册成为临时函数(给UDF命名);
create temporary function 函数名 as 'UDF类全路径';
使用函数
开发环境准备
<dependencies>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>3.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>3.1.4</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
业务代码
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author kirito hive自定义函数UDF 实现对手机号中间4位进行****加密
* @version 1.0
*/
public class EncryptPhoneNumber extends UDF
/**
* 重载evaluate方法 实现函数的业务逻辑
* @param phoNum 入参:未加密手机号
* @return 返回:加密后的手机号字符串
*/
public String evaluate(String phoNum)
String encryptPhoNum = null;
//手机号不为空 并且为11位
if (StringUtils.isNotEmpty(phoNum) && phoNum.trim().length() == 11 )
//判断数据是否满足中国大陆手机号码规范
String regex = "^(1[3-9]\\\\d9$)";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(phoNum);
if (m.matches()) //进入这里都是符合手机号规则的
//使用正则替换 返回加密后数据
encryptPhoNum = phoNum.trim().replaceAll("(\\\\d3)\\\\d4(\\\\d4)","$1****$2");
else
//不符合手机号规则 数据直接原封不动返回
encryptPhoNum = phoNum;
else
//不符合11位 数据直接原封不动返回
encryptPhoNum = phoNum;
return encryptPhoNum;
打jar包上传服务器
在客户端中使用命令把jar包添加至classpath。
链接beeline
bin/beeline -u jdbc:hive2://hadoop102:10000 -n kirito
上传jar
使用命令
create temporary function encrypt_phonenum as 'EncryptPhoneNumber';
使用非法的字符测试一下
这里使用随机数字测试 也是不行的 说明必须使用手机号才可以完成。
这里输入符合大陆手机号码的格式,我们可以看到完成了相应的脱敏处理
以上是关于Hive函数入门--案例:UDF实现手机号加密--代码实现与效果演示的主要内容,如果未能解决你的问题,请参考以下文章
使用Java继承UDF类或GenericUDF类给Hive3.1.2编写UDF实现编码解码加密解密并运行在USDP大数据集群
使用Java继承UDF类或GenericUDF类给Hive3.1.2编写UDF实现编码解码加密解密并运行在USDP大数据集群