如何自定義hive永久函數(shù)

這篇文章給大家分享的是有關(guān)如何自定義hive永久函數(shù)的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),豐鎮(zhèn)企業(yè)網(wǎng)站建設(shè),豐鎮(zhèn)品牌網(wǎng)站建設(shè),網(wǎng)站定制,豐鎮(zhèn)網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,豐鎮(zhèn)網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

需求原因:

hive本身提供一個(gè)nvl的函數(shù),但是該函數(shù)只對null值起作用,現(xiàn)在的需求是不只是對null起作用,對“”這樣的空值也要起作用,所以需要自定義一個(gè)名叫nvls的函數(shù),并集成到hive當(dāng)中去。

具體步驟:

1:先寫好java文件內(nèi)容如下:

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包名叫l(wèi)ixiyuan.jar,然后上傳到服務(wù)器上。本人賬戶是zb_test。

Jar包放到/data/zb_test目錄下。

然后進(jìn)入hive

選測試的數(shù)據(jù)庫:

Use test

然后添加jar包

Add jar /data/zb_test/lixiyuan.jar

然后創(chuàng)建函數(shù)

Create temporary function nvls as ‘org.apahce.hadoop.hive.ql.udf.MyNvl’;

然后就可以測試了

測試成功以后我們就要把集成到hive中去。

3:把函數(shù)集成到hive中去

先說一下添加永久函數(shù)的思路:首先hive里的函數(shù)是跟hive-exec-0.12.0-cdh6.0.0.jar個(gè)jar包有關(guān)的

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

1:先修改環(huán)境變量vi ./.bashrc。內(nèi)容修改為為如下:

把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-cdh6.0.0.jar解壓后的udf目錄下

2:修改hive-exec-0.12.0-cdh6.0.0.jar里的exec目錄下的FunctionRegistry文件,但是我們解壓出來的是都人家編譯好的,所以得需要我們找到源碼,找到FunctionRegistry.java文件后,往里面添加:

import org.apache.hadoop.hive.ql.udf.MyNvl;

registerUDF(“nvls”, MyNvl.class,false);

完成這兩個(gè)步驟就可以了。

但是問題來了:

完成第一個(gè)步驟是簡單的,完成第二個(gè)步驟就復(fù)雜一點(diǎn)了,因?yàn)樵蹅冃薷牧薋unctionRegistry.java文件后得編譯成class文件以后才能用來替換原來的FunctionRegistry.class文件。所以現(xiàn)在解決的是怎么編譯FunctionRegistry.java文件。

3:如何編譯FunctionRegistry.java文件:

因?yàn)镕unctionRegistry.java里面有:import org.apache.hadoop.hive.ql.udf.MyNvl;

registerUDF(“nvls”, MyNvl.class,false);這樣的信息。

所以我們先把剛剛先新建這樣的一個(gè)目錄:

Org/apache/hadoop/hive/ql/udf然后往里面放MyNvl.class文件。

然后把這個(gè)org的目錄打成jar包。名叫hello.jar

Jar -cvf /data/zb_test/hello.jar /data/zb_test/org/

接著,修改環(huán)境變量:

把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-cdh6.0.0.jar替換hive里原來的就ok了。

感謝各位的閱讀!關(guān)于“如何自定義hive永久函數(shù)”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

網(wǎng)站名稱:如何自定義hive永久函數(shù)
鏈接分享:http://bm7419.com/article10/jjchgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、虛擬主機(jī)服務(wù)器托管、定制開發(fā)、網(wǎng)站導(dǎo)航、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化