UDTF:User-Defined Table-Generating Functions,用戶定義表生成函數,用來解決輸入一行輸出多行
UDF只能實現一進一出的操作,單條記錄的列進行的計算操作
UDAF實現多進一出的操作,基於表的所有記錄進行的計算操作,
- 函數類需要繼承UDAF類,計算類Evaluator實現UDAFEvaluator接口
- Evaluator需要實現UDAFEvaluator的init、iterate、terminatePartial、merge、terminate這幾個函數。
a)init函數實現接口UDAFEvaluator的init函數。
b)iterate接收傳入的參數,並進行內部的迭代。其返回類型為boolean。
c)terminatePartial無參數,其為iterate函數遍歷結束后,返回遍歷得到的數據,terminatePartial類似於 hadoop的Combiner。
d)merge接收terminatePartial的返回結果,進行數據merge操作,其返回類型為boolean。
e)terminate返回最終的聚集函數結果。
package hive.udaf; import org.apache.hadoop.hive.ql.exec.UDAF; import org.apache.hadoop.hive.ql.exec.UDAFEvaluator; public class Avg extends UDAF { public static class AvgState { private long mCount; private double mSum; } public static class AvgEvaluator implements UDAFEvaluator { AvgState state; public AvgEvaluator() { super(); state = new AvgState(); init(); } /** * init函數類似於構造函數,用於UDAF的初始化 */ public void init() { state.mSum = 0; state.mCount = 0; } /** * iterate接收傳入的參數,並進行內部的輪轉。其返回類型為boolean * * @param o * @return */ public boolean iterate(Double o) { if (o != null) { state.mSum += o; state.mCount++; } return true; } /** * terminatePartial無參數,其為iterate函數遍歷結束后,返回輪轉數據, * terminatePartial類似於hadoop的Combiner * * @return */ public AvgState terminatePartial() { // combiner return state.mCount == 0 ? null : state; } /** * merge接收terminatePartial的返回結果,進行數據merge操作,其返回類型為boolean * * @param o * @return */ public boolean merge(AvgState avgState) { if (avgState != null) { state.mCount += avgState.mCount; state.mSum += avgState.mSum; } return true; } /** * terminate返回最終的聚集函數結果 * * @return */ public Double terminate() { return state.mCount == 0 ? null : Double.valueOf(state.mSum / state.mCount); } } }
- hive>add jar /home/hadoop/udaf_avg.jar
- hive>create temporary function udaf_avg 'hive.udaf.Avg'
- hive>drop temporary function udaf_avg