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
