本公司有部門須要,hive自己提供一個nvl的函數,可是該函數只對null值起做用,如今的需求是不僅是對null起做用,對「」這樣的空值也要起做用,因此須要自定義一個名叫nvls的函數,並集成到hive當中去。 java
1:先寫好java文件內容以下: 數據庫
package org.apache.hadoop.hive.ql.udf; apache
import org.apache.hadoop.hive.ql.exec.UDF; bash
import org.apache.hadoop.io.Text; 服務器
public class MyNvl extends UDF { 函數
public Text evaluate(final Text t,final Text x) { oop
if(t!=null){ 測試
if(t.toString().equals("")){ lua
return x; spa
}
}else{
return x;
}
return t;
}
}
2:測試:
2.1:先打成jar包名叫lixiyuan.jar,而後上傳到服務器上。本人帳戶是zb_test。
Jar包放到/data/zb_test目錄下。
而後進入hive
選測試的數據庫:
Use test
而後添加jar包
Add jar /data/zb_test/lixiyuan.jar
而後建立函數
Create temporary function nvls as ‘org.apahce.hadoop.hive.ql.udf.MyNvl’;
而後就能夠測試了
測試成功之後咱們就要把集成到hive中去。
3:把函數集成到hive中去
先說一下添加永久函數的思路:首先hive裏的函數是跟hive-exec-0.12.0-cdh5.0.0.jar個jar包有關的
具體的說就是咱們要作兩件事:
1:先修改環境變量vi ./.bashrc。內容修改成爲以下:
把CLASSPATH改爲以下:
export CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$SQOOP_HOME/lib:/opt/boh-2.0.0/hadoop/share/hadoop/tools/lib/*:/opt/boh-2.0.0/hadoop/share/hadoop/common/lib/*:/opt/boh-2.0.0/hadoop/share/hadoop/common/*:/opt/boh-2.0.0/hive/li
(爲一行)
把剛剛寫的java文件編譯成class文件,而後添加到hive-exec-0.12.0-cdh5.0.0.jar解壓後的udf目錄下
2:修改hive-exec-0.12.0-cdh5.0.0.jar裏的exec目錄下的FunctionRegistry文件,可是咱們解壓出來的是都人家編譯好的,因此得須要咱們找到源碼,找到FunctionRegistry.java文件後,往裏面添加:
import org.apache.hadoop.hive.ql.udf.MyNvl;
registerUDF(「nvls」, MyNvl.class,false);
完成這兩個步驟就能夠了。
可是問題來了:
完成第一個步驟是簡單的,完成第二個步驟就複雜一點了,由於我們修改了FunctionRegistry.java文件後得編譯成class文件之後才能用來替換原來的FunctionRegistry.class文件。因此如今解決的是怎麼編譯FunctionRegistry.java文件。
3:如何編譯FunctionRegistry.java文件:
由於FunctionRegistry.java裏面有:import org.apache.hadoop.hive.ql.udf.MyNvl;
registerUDF(「nvls」, MyNvl.class,false);這樣的信息。
因此咱們先把剛剛先新建這樣的一個目錄:
Org/apache/hadoop/hive/ql/udf而後往裏面放MyNvl.class文件。
而後把這個org的目錄打成jar包。名叫hello.jar
Jar -cvf /data/zb_test/hello.jar /data/zb_test/org/
接着,修改環境變量:
把CLASSPATH改爲以下:
export CLASSPATH=/data/zb_test/hello.jar:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$SQOOP_HOME/lib:/opt/boh-2.0.0/hadoop/share/hadoop/tools/lib/*:/opt/boh-2.0.0/hadoop/share/hadoop/common/lib/*:/opt/boh-2.0.0/hadoop/share/hadoop/common/*:/opt/boh-2.0.0/hive/li
而後這樣就能夠編譯FunctionRegistry.java文件了
Javac ./FunctionRegistry.java
而後用生成的FunctionRegistry.class文件替換原來的文件。而後從新把解壓的東西打包成:
hive-exec-0.12.0-cdh5.0.0.jar替換hive裏原來的就ok了。
搞定,手工!