Hive自定義函數包括三種UDF、UDAF、UDTF
UDF(User-Defined-Function) 一進一出
UDAF(User- Defined Aggregation Funcation) 聚集函數,多進一出。Count/max/min
UDTF(User-Defined Table-Generating Functions) 一進多出,如lateral view explore()
使用方式 :在HIVE會話中add 自定義函數的jar文件,然后創建function繼而使用函數
UDF
1、UDF函數可以直接應用於select語句,對查詢結構做格式化處理后,再輸出內容。
2、編寫UDF函數的時候需要注意一下幾點:
a)自定義UDF需要繼承org.apache.hadoop.hive.ql.UDF。
b)需要實現evaluate函數,evaluate函數支持重載。
例:寫一個返回字符串長度的Demo:
import org.apache.hadoop.hive.ql.exec.UDF; public class GetLength extends UDF{ public int evaluate(String str) { try{ return str.length(); }catch(Exception e){ return -1; } } }
3、步驟
a)把程序打包放到目標機器上去;
b)進入hive客戶端,添加jar包:
hive> add jar /root/hive_udf.jar
c)創建臨時函數:
hive> create temporary function getLen as 'com.raphael.len.GetLength';
d)查詢HQL語句:
hive> select getLen(info) from apachelog; OK 60 29 87 102 69 60 67 79 66 Time taken: 0.072 seconds, Fetched: 9 row(s)
e)銷毀臨時函數:
hive> DROP TEMPORARY FUNCTION getLen;
UDAF
多行進一行出,如sum()、min(),用在group by時
1.必須繼承
org.apache.hadoop.hive.ql.exec.UDAF(函數類繼承)
org.apache.hadoop.hive.ql.exec.UDAFEvaluator(內部類Evaluator實現UDAFEvaluator接口)
2.Evaluator需要實現 init、iterate、terminatePartial、merge、terminate這幾個函數
init():類似於構造函數,用於UDAF的初始化
iterate():接收傳入的參數,並進行內部的輪轉,返回boolean
terminatePartial():無參數,其為iterate函數輪轉結束后,返回輪轉數據,類似於hadoop的Combiner
merge():接收terminatePartial的返回結果,進行數據merge操作,其返回類型為boolean
terminate():返回最終的聚集函數結果
#開發一個功能同:
#Oracle的wm_concat()函數
#Mysql的group_concat()
UDAF 詳細文檔:http://www.cnblogs.com/ggjucheng/archive/2013/02/01/2888051.html
UDTF
UDTF 詳細文檔: http://www.cnblogs.com/ggjucheng/archive/2013/02/01/2888819.html
