HIVE编写MD5加密UDF函数

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实现自定义函数方法的步骤:

  1. 编写函数
  2. 打包上传
  3. 创建函数
一、编写函数

用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';

创建成功后,可在所有机器正常使用

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值