用的hive版本是cdh 1.1.0的,业务需要sqoop时做更新操作,所以hive表得生成一个唯一字段,选择用md5,看了其他人的很多关于编写UDF函数的文章,感觉说的很不明确,里面有几个重点在这里提一下:
1. 打包java时需要两个文件,我用的hadoop-cdh版的,所以这两个文件分别是
$HADOOP_HOME/share/hadoop/mapreduce1/hadoop-core-2.6.0-mr1-cdh5.7.0.jar
$HIVE_HOME/lib/hive-exec-1.1.0-cdh5.7.0.jar
2. MD5.java文件(文件名和里面的class要一致)
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;
}
public static void main (String[] args ) {
MD5 md5 = new MD5();
System.out.println(md5.evaluate(" "));
}
}
3. 打包命令(写的时候两个jar包之间用:来连接,自行加文件目录)
javac -classpath hadoop-core-2.6.0-mr1-cdh5.7.0.jar:hive-exec-1.1.0-cdh5.7.0.jar MD5.java
jar cvf udf-md5.jar MD5.class
4. 进入hive命令行
PS: 此处要注意,临时加入函数后,用show functions; 可以看到加入的函数是md5,而永久加入的函数看到的是default.md5,如果在其他数据库中执行加入函数操作,则函数名就是别的db.md5
# 临时加入该函数
add jar /jar_file/udf-md5.jar;
create temporary function md5 as 'MD5';
永久加入md5函数
首先得把jar包放到hdfs上
hdfs dfs -mkdir /jar-file
hdfs dfs -put udf-md5.jar /jar-file
在hive里执行
create function md5 as 'MD5' using jar 'hdfs:///jar-file/udf-md5.jar';
自此就成功了!