因為公司使用的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