User Defined Aggregation Funcation
用户自定义聚类方法,和group by联合使用
接受多个输入数据行,并产生一个输出数据行
(顺带一句,UDTF (user-defined table-generating function)
用户定义表生成函数,操作作用于单个数据行,且产生多个数据行)
两种实现
hive有两种UDAF:简单和通用
简单,利用抽象类UDAF和UDAFEvaluator,使用Java反射导致性能损失,且有些特性不能使用,如可变长度参数列表
通用,利用接口GenericUDAFResolver2(或者抽象类AbstractGenericUDAFResolver)和抽象类GenericUDAFEvaluator,可以使用所有功能,但比较复杂,不直观
简单方式实现
UDAF的运行流程
PARTIAL1:原始数据到部分聚合,调用iterate和terminatePartial –> map阶段
PARTIAL2: 部分聚合到部分聚合,调用merge和terminatePartial –> combine阶段
FINAL: 部分聚合到完全聚合,调用merge和terminate –> reduce阶段
COMPLETE: 从原始数据直接到完全聚合 –> map阶段,并且没有reduce
实现
需要继承org.apache.hadoop.hive.ql.exec.UDAF类
内部类Evaluator实现org.apache.h