1. 程式人生 > >自定義hive永久函式詳細步驟

自定義hive永久函式詳細步驟

自定義hive永久函式詳細步驟

需求原因:

本公司有部門需要,hive本身提供一個nvl的函式,但是該函式只對null值起作用,現在的需求是不只是對null起作用,對“”這樣的空值也要起作用,所以需要自定義一個名叫nvls的函式,並整合到hive當中去。

具體步驟:

1:先寫好java檔案內容如下:

package org.apache.hadoop.hive.ql.udf;

import org.apache.hadoop.hive.ql.exec.UDF;

import org.apache.hadoop.io.Text;

public class MyNvl extends UDF {

public Text evaluate(final Text t,final Text x) {

if(t!=null){

if(t.toString().equals("")){

return x;

}

}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.jarjar包有關的

具體的說就是我們要做兩件事:

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了。

搞定,手工!