Hive發展至今,自身已經很是成熟了,可是爲了靈活性,仍是提供了各類各樣的 插件的方式,只有你想不到的,沒有作不到的,主流的開源框架都有相似的機制,包括Hadoop,Solr,Hbase,ElasticSearch,這也是面向抽象編程的好處,很是容易擴展。java
最近在使用hive1.2.0的版本,由於要給有一列的數據生成md5簽名,便於查重數據使用,看了下hive的官網文檔發現是支持的,後來在Hue裏面試了下,發現不支持,還覺得是Hue的問題因而在後臺hive命令行裏面試了下,發現一樣不支持,官網的文檔應該是Hive2.x的了因此不支持也有可能,但也不必爲了使用個md5函數就把hive升級到最新版本,那樣有點本末倒置,那就寫個UDF解決吧,之前寫過Pig的UDF,很是簡單,Hive的應該也不會太難,看了官網文檔,果真很是easy,下面看下步驟:python
注意,這裏用的是maven項目,只須要引入hive-exec包便可:linux
<dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>1.2.1</version> <scope>provided</scope> </dependency>
evaluate方法並非重寫的方法,而是一個新的方法,Pig裏面是須要重寫exec方法,來完成自定義邏輯的,代碼以下:面試
package com.easy.md5; import com.google.common.base.Strings; import com.google.common.hash.Hashing; import org.apache.hadoop.hive.ql.exec.UDF; /** * Created by qindongliang on 2016/5/23. * Hive自定義UDF,計算md5值 */ public class MD5 extends UDF { /** * @param s 傳入參數 * @return md5值 */ public String evaluate(final String s) { if(Strings.isNullOrEmpty(s.trim())){ return null; } return Hashing.md5().hashString(s.trim()).toString(); } }
程序完成後,打包成jar,而後上傳到對應的機器上,開始註冊本身的UDF函數,這裏有兩種方式:算法
A:臨時註冊sql
執行hive命令,進入終端:shell
add jar /home/hive/udfs/hive-md5-guava-1.0.0.jar; create temporary function md5 as 'com.easy.md5.MD5'; select md5('hadoop'); --結果: 3abb766da6c2c2d7739f3cb7799a4caa
B:永久註冊(hive0.13以後支持)apache
在linux上,上傳jar包至HDFS中編程
hadoop fs -put hive-md5-guava-1.0.0.jar /user/tez/
進入hive終端框架
CREATE FUNCTION md5 AS 'com.easy.md5.MD5' USING JAR 'hdfs:///user/tez/hive-md5-guava-1.0.0.jar' ; select md5('hadoop'); --結果: 3abb766da6c2c2d7739f3cb7799a4caa --刪除臨時函數 DROP TEMPORARY FUNCTION [IF EXISTS] function_name; --刪除永久函數 DROP FUNCTION [IF EXISTS] function_name; --從新加載函數 hive1.2.0以後支持 RELOAD FUNCTION;
這樣就不用每次打開終端都須要註冊了
Hue是一款基於Web可視化提交任務的框架,由python編寫,若是想要在hue中,使用自定義的UDF函數,須要稍做配置,不然使用過程當中可能會報錯,即便你在服務端已經註冊過了。