• 10分钟学会Hive之用户自定义函数UTF开发


    1. 用户自定义函数概述        

            用户自定义函数简称UDF,源自于英文user-defined function。自定义函数总共有3类,是根据函数输入输出的行数来区分的,分别是:

    UDF(User-Defined-Function)普通函数,一进一出

    UDAF(User-Defined Aggregation Function)聚合函数,多进一出

    UDTF(User-Defined Table-Generating Functions)表生成函数,一进多出

    UTF标准分类扩大化:

    UDF分类标准可以扩大到Hive的所有函数中:包括内置函数和自定义函数。

    1.1 UTF普通函数

            UDF函数通常把它叫做普通函数,最大的特点是一进一出,也就是输入一行输出一行。比如round这样的取整函数,接收一行数据,输出的还是一行数据。

    1.2 UTAF聚合函数

            UDAF函数通常把它叫做聚合函数,A所代表的单词就是Aggregation聚合的意思。最大的特点是多进一出,也就是输入多行输出一行。比如count、sum这样的函数。

    1. count:统计检索到的总行数。
    2. sum:求和
    3. avg:求平均
    4. min:最小值
    5. max:最大值
    6. 数据收集函数(去重): collect_set(col)
    7. 数据收集函数(不去重): collect_list(col)

    1.3 UDTF表生成函数

            UDTF函数通常把它叫做表生成函数,T所代表的单词是Table-Generating表生成的意思。最大的特点是一进多出,也就是输入一行输出多行。

            UDTF函数也是我们接触比较少的函数,比如explode函数

    2. 开发UTF案例

    2.1 需求描述

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

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

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

    2.2 实现步骤

    2.2.1 开发环境准备
    1. <dependencies>
    2. <dependency>
    3. <groupId>org.apache.hive</groupId>
    4. <artifactId>hive-exec</artifactId>
    5. <version>3.1.2</version>
    6. </dependency>
    7. <dependency>
    8. <groupId>org.apache.hadoop</groupId>
    9. <artifactId>hadoop-common</artifactId>
    10. <version>3.1.4</version>
    11. </dependency>
    12. </dependencies>
    13. <build>
    14. <plugins>
    15. <plugin>
    16. <groupId>org.apache.maven.plugins</groupId>
    17. <artifactId>maven-shade-plugin</artifactId>
    18. <version>2.2</version>
    19. <executions>
    20. <execution>
    21. <phase>package</phase>
    22. <goals>
    23. <goal>shade</goal>
    24. </goals>
    25. <configuration>
    26. <filters>
    27. <filter>
    28. <artifact>*:*</artifact>
    29. <excludes>
    30. <exclude>META-INF/*.SF</exclude>
    31. <exclude>META-INF/*.DSA</exclude>
    32. <exclude>META-INF/*.RSA</exclude>
    33. </excludes>
    34. </filter>
    35. </filters>
    36. </configuration>
    37. </execution>
    38. </executions>
    39. </plugin>
    40. </plugins>
    41. </build>
    2.2.2 业务代码
    1. package cn.ittest.hive.udf;
    2. import org.apache.commons.lang.StringUtils;
    3. import org.apache.hadoop.hive.ql.exec.UDF;
    4. import java.util.regex.Matcher;
    5. import java.util.regex.Pattern;
    6. /**
    7. * @description: hive自定义函数UDF 实现对手机号中间4位进行****加密
    8. * @author: Itcast
    9. */
    10. public class EncryptPhoneNumber extends UDF {
    11. /**
    12. * 重载evaluate方法 实现函数的业务逻辑
    13. * @param phoNum 入参:未加密手机号
    14. * @return 返回:加密后的手机号字符串
    15. */
    16. public String evaluate(String phoNum){
    17. String encryptPhoNum = null;
    18. //手机号不为空 并且为11
    19. if (StringUtils.isNotEmpty(phoNum) && phoNum.trim().length() == 11 ) {
    20. //判断数据是否满足中国大陆手机号码规范
    21. String regex = "^(1[3-9]\\d{9}$)";
    22. Pattern p = Pattern.compile(regex);
    23. Matcher m = p.matcher(phoNum);
    24. if (m.matches()) {//进入这里都是符合手机号规则的
    25. //使用正则替换 返回加密后数据
    26. encryptPhoNum = phoNum.trim().replaceAll("()\\d{4}(\\d{4})","$1****$2");
    27. }else{
    28. //不符合手机号规则 数据直接原封不动返回
    29. encryptPhoNum = phoNum;
    30. }
    31. }else{
    32. //不符合11位 数据直接原封不动返回
    33. encryptPhoNum = phoNum;
    34. }
    35. return encryptPhoNum;
    36. }
    37. }
    2.2.3 打包部署

    jar包上传到Hiveserver2服务运行所在机器的linux系统,或者HDFS文件系统。

    2.2.4 添加至Hive Classpath

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

    2.2.5 注册临时函数

    2.2.6 功能演示

  • 相关阅读:
    【C#】委托与事件
    409. 最长回文串
    【设计模式】创建型模式:单例模式
    JAVA:实现N Queens 皇后问题算法(附完整源码)
    你该用什么的美剧学英语?
    K8s 高可用集群架构(二进制)部署及应用
    WPF开源的一款免费、开箱即用的翻译、OCR工具
    2022广西师范大学暑期训练赛 E ,K
    vue之搭建脚手架快速创建vue项目
    Java中如何进行加锁??
  • 原文地址:https://blog.csdn.net/u010763324/article/details/132852419