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

Posted kiritobryant

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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类全路径';

使用函数

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

<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大数据集群

Hive学习之五 《Hive进阶—UDF操作案例》 详解

Hive入门--3.UDF编写与使用

如何写hive的udf函数

hive 的udf 函数使用