hive--udf函数(开发-4种加载方式)
UDF函數(shù)開發(fā)
標(biāo)準(zhǔn)函數(shù)(UDF):以一行數(shù)據(jù)中的一列或者多列數(shù)據(jù)作為參數(shù)然后返回解雇歐式一個(gè)值的函數(shù),同樣也可以返回一個(gè)復(fù)雜的對(duì)象,例如array,map,struct。
聚合函數(shù)(UDAF):接受從零行到多行的零個(gè)到多個(gè)列,然后返回單一值。例如sum函數(shù)。
生成函數(shù)(UDTF):接受零個(gè)或者多個(gè)輸入,然后產(chǎn)生多列或者多行輸出。
udf函數(shù)開發(fā)
當(dāng)Hive提供的內(nèi)置函數(shù)無(wú)法滿足你的業(yè)務(wù)處理需要時(shí),此時(shí)就可以考慮使用用戶自定義函數(shù),用戶自定義函數(shù)(user defined function),針對(duì)單條記錄。編寫一個(gè)UDF,需要繼承UDF類,并實(shí)現(xiàn)evaluate()函數(shù)。在查詢執(zhí)行過(guò)程中,查詢中對(duì)應(yīng)的每個(gè)應(yīng)用到這個(gè)函數(shù)的地方都會(huì)對(duì)這個(gè)類進(jìn)行實(shí)例化。對(duì)于每行輸入都會(huì)調(diào)用到evaluate()函數(shù)。而evaluate()函數(shù)處理的值會(huì)返回給Hive。同時(shí)用戶是可以重載evaluate方法的。Hive會(huì)像Java的方法重載一樣,自動(dòng)選擇匹配的方法。
準(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;
}
@Test
public 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
注意:這個(gè)地方可能有報(bào)錯(cuò),反正我是遇到了!
解決辦法:
1,修改jdk的版本 可能版本太高。
2,刪除META-INF 文件中*.SF的文件,這個(gè)是依賴包有沖突導(dǎo)致的。
3.在MANIFEST.MF 中添加Main-Class: cn.rtmap.bigdata.hive.testUDF.udf.UDFZodiacSign,這個(gè)可以在maven中創(chuàng)建好。
UDF四種加載方式
第一種:
是最常見(jiàn)但也不招人喜歡的方式是使用ADD JAR(s)語(yǔ)句,之所以說(shuō)是不招人喜歡是,通過(guò)該方式添加的jar文件只存在于當(dāng)前會(huì)話中,當(dāng)會(huì)話關(guān)閉后不能夠繼續(xù)使用該jar文件,最常見(jiàn)的問(wèn)題是創(chuàng)建了永久函數(shù)到metastore中,再次使用該函數(shù)時(shí)卻提示ClassNotFoundException。所以使用該方式每次都要使用ADD JAR(s)語(yǔ)句添加相關(guān)的jar文件到Classpath中。
第二種:
是修改hive-site.xml文件。修改參數(shù)hive.aux.jars.path的值指向UDF文件所在的路徑。,該參數(shù)需要手動(dòng)添加到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在啟動(dòng)時(shí)會(huì)將其中的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文件目錄來(lái)實(shí)現(xiàn),或者在系統(tǒng)中直接添加HIVE_AUX_JARS_PATH環(huán)境變量。
總結(jié)
以上是生活随笔為你收集整理的hive--udf函数(开发-4种加载方式)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 今天宜修墓地不
- 下一篇: 矩阵分解系列三:非负矩阵分解及Pytho