GenericUDAFEvaluator类中evaluate()和aggregate()方法的重要性

时间:2017-03-23 09:12:35

标签: hive

GenericUDAFEvaluator类中evaluate()和aggregate()方法的用途/重要性是什么?它与merge()的作用有何不同?

关于使用上述内容的任何示例都会有所帮助。

merge()的用法:http://beekeeperdata.com/posts/hadoop/2015/08/17/hive-udaf-tutorial.html

Javadocs:https://hive.apache.org/javadocs/r0.10.0/api/org/apache/hadoop/hive/ql/udf/generic/GenericUDAFEvaluator.html

1 个答案:

答案 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调用的减少阶段。