释义
UDAF是User Defined Aggregation Function的简称。UDAF用来进行聚合运算,其输入是多行数据,输出一个计算结果。
如何开发
UDAF有两种实现方式:继承UDAF;或继承AbstractGenericUDAFResolver。前一种方式是简单的方式,但其使用了java的反射机制,因此性能上比后一种方式要低效,因此生产上不建议使用第一种方式。
计算的逻辑设计
继承AbstractGenericUDAFResolver抽象类,需要实现一个getEvaluator方法,该方法返回一个实例,该实例继承GnericEvaluator抽象类,GnericEvaluator的实现类才是进行聚合计算的具体实现类。
GnericEvaluator有以下几个方法需要开发自己实现:getNewAggregationBuffer、iterate、merge、reset、terminatePartial、terminate。另外需要重写init方法,该方法在抽象类中已经实现,但其返回值是null,在开发时如果不重新该方法,可能会在调用时报控指针异常。
一般的UDAF函数在hive计算过程中涉及到三个阶段,对应方式:PARTIAL1、PARTIAL2、FINAL。
PARTIAL1阶段是map阶段计算,此阶段会调用函数的init、iterate、terminatePartial三个方法。
PARTIAL2阶段是map后的combine阶段,是部分结果聚合,此阶段会调用函数的init、merge、terminatePartial三个方法。
FINAL阶段是reduce阶段,输出给hive最终结果,此阶段会调用函数的init、merge、terminate三个方法。
一些特殊的UDAF只有Map阶段,对应方式:COMPLETE。
COMPLETE只有Map阶段,其调用方法init、iterate、terminate三个方法。
方法释义
getNewAggregationBuffer方法是返回一个AggregationBuffer实例,该实例实现了AggregationBuffer接口,该接口是个空的接口,其方法是根据实际需要自己定义。AggregationBuffer实例是用来缓存中间及最后聚合结果的。
reset方法是重置AggregationBuffer实例。
iterate方法是逐行处理输入的数据的。
merge是进行计算结果合并的,包括combine阶段及reduce阶段。
ter