Hive函数入门--案例:UDF实现手机号加密--代码实现与效果演示

需求描述

在企业中处理数据的时候,对于敏感数据往往需要进行脱敏处理。比如手机号。我们常见的处理方式是将手机号中间4位进行****处理。

Hive中没有这样的函数可以直接实现功能,虽然可以通过各种函数的嵌套调用最终也能实现,但是效率不高,现要求自定义开发实现Hive函数,满足上述需求。

  1. 能够对输入数据进行非空判断、位数判断处理
  2. 能够实现校验手机号格式,把满足规则的进行****处理
  3. 对于不符合手机号规则的数据原封不动不处理

 

实现步骤

通过业务分析,可以发现我们需要实现的函数是一个输入一行输出一行的函数,也就是所说的UDF普通函数。

根据Hive当中的UDF开发规范,实现步骤如下:

  1. 写一个java类,继承UDF,并重载evaluate方法;
  2. 程序打成jar包,上传服务器添加到hive的classpath;

hive>add JAR /home/hadoop/udf.jar;

注册成为临时函数(给UDF命名);

create temporary function 函数名 as 'UDF类全路径';

使用函数

​​​​​​开发环境准备


    
        org.apache.hive
        hive-exec
        3.1.2
    
    
        org.apache.hadoop
        hadoop-common
        3.1.4
    


    
        
            org.apache.maven.plugins
            maven-shade-plugin
            2.2
            
                
                    package
                    
                        shade
                    
                    
                        
                            
                                *:*
                                
                                    META-INF/*.SF
                                    META-INF/*.DSA
                                    META-INF/*.RSA
                                
                            
                        
                    
                
            
        
    

业务代码

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]\\d{9}$)";
            Pattern p = Pattern.compile(regex);
            Matcher m = p.matcher(phoNum);
            if (m.matches()) {//进入这里都是符合手机号规则的
                //使用正则替换 返回加密后数据
                encryptPhoNum = phoNum.trim().replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2");
            }else{
                //不符合手机号规则 数据直接原封不动返回
                encryptPhoNum = phoNum;
            }
        }else{
            //不符合11位 数据直接原封不动返回
            encryptPhoNum = phoNum;
        }
        return encryptPhoNum;
    }
}

 

打jar包上传服务器

Hive函数入门--案例:UDF实现手机号加密--代码实现与效果演示_第1张图片

 Hive函数入门--案例:UDF实现手机号加密--代码实现与效果演示_第2张图片

 在客户端中使用命令把jar包添加至classpath。

Hive函数入门--案例:UDF实现手机号加密--代码实现与效果演示_第3张图片

 

Hive函数入门--案例:UDF实现手机号加密--代码实现与效果演示_第4张图片

Hive函数入门--案例:UDF实现手机号加密--代码实现与效果演示_第5张图片 

 链接beeline 

bin/beeline -u jdbc:hive2://hadoop102:10000 -n kiritoHive函数入门--案例:UDF实现手机号加密--代码实现与效果演示_第6张图片

上传jar

Hive函数入门--案例:UDF实现手机号加密--代码实现与效果演示_第7张图片 

使用命令

create temporary function encrypt_phonenum as 'EncryptPhoneNumber';

 Hive函数入门--案例:UDF实现手机号加密--代码实现与效果演示_第8张图片

 使用非法的字符测试一下

 

Hive函数入门--案例:UDF实现手机号加密--代码实现与效果演示_第9张图片

这里使用随机数字测试 也是不行的 说明必须使用手机号才可以完成。

Hive函数入门--案例:UDF实现手机号加密--代码实现与效果演示_第10张图片

这里输入符合大陆手机号码的格式,我们可以看到完成了相应的脱敏处理Hive函数入门--案例:UDF实现手机号加密--代码实现与效果演示_第11张图片

 

你可能感兴趣的:(hive,hadoop,大数据)