天天看點

Hive1.2開發MD5使用者自定義函數UDF建立項目開發編譯注冊到Hive

因為公司使用的Hive版本是1.2,沒有自帶md5函數, 于是通過開發udf函數來實作該功能。我們使用IDEA和Maven來開發和建構。

建立項目

打開IntelliJ IDEA。

File => New => Project =>Maven =>勾選 Create from archetype => org.apache.maven.archetypes:maven-archetype-quickstart。

自己配置好groupId和artifactId。

開發編譯

添加dependency

<dependency>
  <groupId>org.apache.hive</groupId>
  <artifactId>hive-exec</artifactId>
  <version>0.13.0</versioin>
</dependency>
<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-common</artifactId>
  <version>2.4.0</versioin>
</dependency>           

編寫代碼

package com.company.udf;

import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF;

import java.security.MessageDigest;

public class MD5 extends UDF {

    public String evaluate (final String str) {
        if (StringUtils.isBlank(str)){
            return "";
        }
        String digest = null;
        StringBuffer buffer = new StringBuffer();
        try {
            MessageDigest digester = MessageDigest.getInstance("md5");
            byte[] digestArray = digester.digest(str.getBytes("UTF-8"));
            for (int i = 0; i < digestArray.length; i++) {
                buffer.append(String.format("%02x", digestArray[i]));
            }
            digest = buffer.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return digest;
    }
}
           

測試MD5

可以在上面的類代碼中添加如下代碼:

public static void main (String[] args ) {
    MD5 md5 = new MD5();
    System.out.println(md5.evaluate("hello"));
}           

編譯打包

mvn clean package -DskipTests           

注冊到Hive

上傳jar包到hdfs

在這之前,我們一般會把jar上傳到Hive機器的本地檔案系統,記住要使用二進制傳輸方式。如果使用的secureCRT的rz指令,預設為勾選ascii方式,需要取消這個選項。

我們可以用一下指令檢視jar包中的類,不報錯就說明上傳沒問題。

jar tf xxx.jar           

使用如下指令上傳到hdfs:

hadoop fs -put MD5.jar /tmp/udf/           

将jar包添加到hive

後面的路徑為jar包所在的絕對路徑。

hive> add jar hdfs:///tmp/udf/MD5.jar
           

建立臨時UDF

hive> create temporary function md5 as 'com.company.udf.MD5';           

建立永久UDF

hive> create function md5 as 'com.company.udf.MD5' using jar 'hdfs:///tmp/udf/MD5.jar';           

測試UDF

select md5('hadoop');
--結果: 3abb766da6c2c2d7739f3cb7799a4caa
--删除臨時函數
DROP TEMPORARY FUNCTION [IF EXISTS] function_name;
--删除永久函數
DROP FUNCTION [IF EXISTS] function_name;
--重新加載函數 hive1.2.0之後支援
RELOAD FUNCTION;           

原文來自個人CSDN:

https://blog.csdn.net/weixin_36573294/article/details/107173859