在hive中豺旬,有時(shí)候一些內(nèi)置的函數(shù)钠惩,和普通的查詢操作已經(jīng)滿足不了我們要查詢的要求,這時(shí)候可以自己寫一些自定義函數(shù)來(lái)處理族阅。自定義函數(shù)(user defined function =UDF)
由于hive本身是用java語(yǔ)言開發(fā)篓跛,所以u(píng)df必須用java來(lái)寫才可以。
Hive中有三種UDF
-
普通udf(UDF)
操作單個(gè)數(shù)據(jù)行耘分,且產(chǎn)生一個(gè)數(shù)據(jù)作為輸出举塔。例如(數(shù)學(xué)函數(shù),字符串函數(shù)) -
聚合udf (UDAF)
接受多個(gè)數(shù)據(jù)行求泰,并產(chǎn)生一個(gè)數(shù)據(jù)行作為輸出。例如(COUNT计盒,MAX函數(shù)等) -
表生成UDF(UDTF)
接受一個(gè)數(shù)據(jù)行渴频,然后返回產(chǎn)生多個(gè)數(shù)據(jù)行(一個(gè)表作為輸出)。比如lateral view(據(jù)說(shuō)是一個(gè)將行轉(zhuǎn)成列的函數(shù))北启。
編寫UDF必須滿足一下:
- 必須是org.apache.hadoop.hive.ql.exec.UDF的子類
- 必須實(shí)現(xiàn)evaluate函數(shù)卜朗。
下面展示如何編寫一個(gè)普通的UDF
1、編寫類咕村,繼承UDF類场钉,重寫evaluate方法
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.hadoop.hive.ql.exec.UDF;
public class TimeDiff extends UDF {
public String evaluate(String endTime, String startTime, String format) {
SimpleDateFormat dfs = new SimpleDateFormat(format);
long diff = 0;
Date end = null;
Date start = null;
try {
end = dfs.parse(endTime);
start = dfs.parse(startTime);
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
diff = (end.getTime() - start.getTime());
return Long.toString(diff);
}
public String evaluate(String endTime, String startTime) {
String format = "yyyyMMdd";
return evaluate(endTime, startTime, format);
}
}
2、 打包后上傳到客戶端所在的目錄
3懈涛、使用該函數(shù)前逛万,需要執(zhí)行以下兩行命令:
ADD JAR /home/hadoop/hive/hive-udf.jar;
CREATE TEMPORARY FUNCTION time_diff AS 'cn.splus.hiveudf.dateutil.TimeDiff';
4、在sql中使用該函數(shù)
select year, time_diff(date1, date2) from table;