GenericUDAFEvaluator类中evaluate()和aggregate()方法的用途/重要性是什么?它与merge()的作用有何不同?
关于使用上述内容的任何示例都会有所帮助。
merge()的用法:http://beekeeperdata.com/posts/hadoop/2015/08/17/hive-udaf-tutorial.html
答案 0 :(得分:0)
检查源代码有助于澄清事情。以下是GenericUDAFEvaluator.class文件中相同的代码片段
evaluate():此方法确保在执行模式为PARTIAL1或PARTIAL2时调用terminatePartial()实现,否则将调用terminate()以输出最终结果。
public Object evaluate(AggregationBuffer agg) throws HiveException {
if ((this.mode == Mode.PARTIAL1) || (this.mode == Mode.PARTIAL2)) {
return terminatePartial(agg);
}
return terminate(agg);
}
aggregate():此方法检查执行模式以调用iterate()或merge()。
public void aggregate(AggregationBuffer agg, Object[] parameters) throws HiveException {
if ((this.mode == Mode.PARTIAL1) || (this.mode == Mode.COMPLETE)) {
iterate(agg, parameters);
} else {
assert (parameters.length == 1);
merge(agg, parameters[0]);
}
}
在UDAF的生命周期中,差异执行模式如下 •PARTIAL1 ○从原始数据到部分聚合数据:将调用iterate()和terminatePartial()。从mapper调用。 •PARTIAL2 ○从部分聚合数据到部分聚合数据:将调用merge()和terminatePartial()。从组合器调用。 •完成 ○从原始数据直接到完全聚合:将调用iterate()和terminate()。在不通过map-reduce阶段生成UDAF的情况下调用。即呼叫仅限于减速器阶段。 • 最后 从部分聚合到完全聚合:将调用merge()和terminate()。调用map-reduce的跨越UDAF调用的减少阶段。