UDAF主要分为2个部分:第一个部分是对传入参数进行校验,数据类型的校验。然后根据传入的数据类型不同调用具体的处理逻辑。
AbstractGenericUDAFResolver:当需要使用UDAF时,需要继承AbstractGenericUDAFResolver抽象类
ObjectInspector:ObjectInspector接口使得Hive可以不拘泥于一种特定数据格式,使得数据流
1)在输入端和输出端切换不同的输入/输出格式 2)在不同的Operator上使用不同的数据格式。
PrimitiveObjectInspector:UDAF使用一个ObjectInspector来抽象化每一行数据的读取。上面使用的Primitive类型的数据,所以使PrimitiveObjectInspector来读取传入的参数
Evaluator:在Evaluator方法里面,对参数进行校验
Mode:
PARTIAL1:这个是mapreduce的map阶段:从原始数据到部分数据聚合,将会调用iterate()和terminatePartial()
PARTIAL2:这个是mapreduce的map端的Combiner阶段,负责在map端合并map的数据:从部分数据聚合到部分数据聚合:将会调用merge() 和 terminatePartial()
FINAL:
mapreduce的reduce阶段:从部分数据的聚合到完全聚合,将会调用merge()和terminate()
COMPLETE: 如果出现了这个阶段,表示mapreduce只有map,没有reduce,所以map端就直接出结果了:从原始数据直接到完全聚合将会调用 iterate()和terminate()