日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hive--udf函数(开发-4种加载方式)

發(fā)布時間:2025/7/14 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hive--udf函数(开发-4种加载方式) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

UDF函數(shù)開發(fā)

標(biāo)準(zhǔn)函數(shù)(UDF):以一行數(shù)據(jù)中的一列或者多列數(shù)據(jù)作為參數(shù)然后返回解雇歐式一個值的函數(shù),同樣也可以返回一個復(fù)雜的對象,例如array,map,struct。

聚合函數(shù)(UDAF):接受從零行到多行的零個到多個列,然后返回單一值。例如sum函數(shù)。

生成函數(shù)(UDTF):接受零個或者多個輸入,然后產(chǎn)生多列或者多行輸出。

udf函數(shù)開發(fā)

當(dāng)Hive提供的內(nèi)置函數(shù)無法滿足你的業(yè)務(wù)處理需要時,此時就可以考慮使用用戶自定義函數(shù),用戶自定義函數(shù)(user defined function),針對單條記錄。編寫一個UDF,需要繼承UDF類,并實現(xiàn)evaluate()函數(shù)。在查詢執(zhí)行過程中,查詢中對應(yīng)的每個應(yīng)用到這個函數(shù)的地方都會對這個類進行實例化。對于每行輸入都會調(diào)用到evaluate()函數(shù)。而evaluate()函數(shù)處理的值會返回給Hive。同時用戶是可以重載evaluate方法的。Hive會像Java的方法重載一樣,自動選擇匹配的方法。

準(zhǔn)備數(shù)據(jù):

littlebigdata.txt

edward capriolo,edward@media6degrees.com,2-12-1981,209.191.139.200,M,10 bob,bob@test.net,10-10-2004,10.10.10.1,M,50 sara connor,sara@sky.net,4-5-1974,64.64.5.1,F,2

創(chuàng)建表:

create table if not exists littlebigdata( name string, email string, bday string, ip string, gender string, anum int ) row format delimited fields terminated by ',';

加載數(shù)據(jù):

load data local inpath 'littlebigdata.txt' into table littlebigdata;

代碼示例:

import java.text.SimpleDateFormat; import java.util.Date; import org.apache.hadoop.hive.ql.exec.UDF; import org.junit.Test;public class UDFZodiacSign extends UDF {private SimpleDateFormat df ;public UDFZodiacSign() {df = new SimpleDateFormat("MM-dd-yyyy");}public String evaluate(Date bday){return evaluate(bday.getMonth(),bday.getDay());}public String evaluate(String bday){Date date =null;try{date = df.parse(bday);}catch(Exception ex){System.out.println("異常");ex.printStackTrace();return null; }return evaluate(date.getMonth()+1,date.getDay());}public String evaluate(Integer month,Integer day){if(month ==1){if(day<20){return "Capricorn";}else{return "Aquarius";}}if(month ==2){if(day<19){return "Capricorn";}else{return "Pisces";}}if(month ==3){if(day<20){return "Pisces";}else{return "Aries";}}if(month ==4){if(day<20){return "Aries";}else{return "Taurus";}}if(month ==5){if(day<20){return "Taurus";}else{return "Gemini";}}if(month ==6){if(day<21){return "Gemini";}else{return "Cancer";}}if(month ==7){if(day<22){return "Cancer";}else{return "Leo";}}if(month ==8){if(day<23){return "Leo";}else{return "Virgo";}}if(month ==9){if(day<22){return "Virgo";}else{return "Libra";}}if(month ==10){if(day<24){return "Libra";}else{return "Scorpio";}}if(month ==11){if(day<22){return "Scorpio";}else{return "Sagittarius";}}if(month ==12){if(day<22){return "Sagittarius";}else{return "Capricorn";}}return null;}@Testpublic void test() {UDFZodiacSign aa = new UDFZodiacSign();String str = aa.evaluate("01-10-2004");System.out.println(str);}} udf代碼示例

函數(shù)使用

加載:

add jar testUDF-0.0.1-SNAPSHOT.jar; create temporary function zodiac as "cn.rtmap.bigdata.hive.testUDF.udf.UDFZodiacSign";

查詢:

select name,bday,zodiac(bday) from littlebigdata;

結(jié)果:

edward capriolo 2-12-1981 Capricorn bob 10-10-2004 Libra sara connor 4-5-1974 Aries

注意:這個地方可能有報錯,反正我是遇到了!

解決辦法:

1,修改jdk的版本 可能版本太高。 2,刪除META-INF 文件中*.SF的文件,這個是依賴包有沖突導(dǎo)致的。 3.在MANIFEST.MF 中添加Main-Class: cn.rtmap.bigdata.hive.testUDF.udf.UDFZodiacSign,這個可以在maven中創(chuàng)建好。

UDF四種加載方式

第一種:

是最常見但也不招人喜歡的方式是使用ADD JAR(s)語句,之所以說是不招人喜歡是,通過該方式添加的jar文件只存在于當(dāng)前會話中,當(dāng)會話關(guān)閉后不能夠繼續(xù)使用該jar文件,最常見的問題是創(chuàng)建了永久函數(shù)到metastore中,再次使用該函數(shù)時卻提示ClassNotFoundException。所以使用該方式每次都要使用ADD JAR(s)語句添加相關(guān)的jar文件到Classpath中。

第二種:

是修改hive-site.xml文件。修改參數(shù)hive.aux.jars.path的值指向UDF文件所在的路徑。,該參數(shù)需要手動添加到hive-site.xml文件中。 <property> <name>hive.aux.jars.path</name> <value>file:///jarpath/all_new1.jar,file:///jarpath/all_new2.jar</value> </property>

?第三種:

是在${HIVE_HOME}下創(chuàng)建auxlib目錄,將UDF文件放到該目錄中,這樣hive在啟動時會將其中的jar文件加載到classpath中。(推薦)

?第四種:

是設(shè)置HIVE_AUX_JARS_PATH環(huán)境變量,變量的值為放置jar文件的目錄,可以拷貝${HIVE_HOME}/conf中的hive-env.sh.template為hive-env.sh文件,并修改最后一行的#export HIVE_AUX_JARS_PATH=為exportHIVE_AUX_JARS_PATH=jar文件目錄來實現(xiàn),或者在系統(tǒng)中直接添加HIVE_AUX_JARS_PATH環(huán)境變量。

轉(zhuǎn)載于:https://www.cnblogs.com/chushiyaoyue/p/6632090.html

總結(jié)

以上是生活随笔為你收集整理的hive--udf函数(开发-4种加载方式)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。