创建存储对象的类
![](https://i-blog.csdnimg.cn/blog_migrate/305da051facbcee6869bc66ca3912f67.png)
创建对象
![](https://i-blog.csdnimg.cn/blog_migrate/1ccc6f942218ae1dff3a2e1bdfb7c21e.png)
UDAF需要调用到的方法:
init
HIVE会调用此方法来初始实例化一个UDAF evaluator类
![](https://i-blog.csdnimg.cn/blog_migrate/de620535bfb9af571930e264bef7dfb5.png)
iterate
将一行新的数据载入到聚合buffer中(对数据进行初始化处理)
![](https://i-blog.csdnimg.cn/blog_migrate/abd45d68170d3010fd2f513f1a278414.png)
terminatePartial
以一种可持续化的方法返回当前聚合内容。(返回值只可以使用Java基本型数据和array,以及基本封装类型(例如Double),Hadoop中Writeable类、list和map类型。不能使用用户自定义类(即使实现了Java.io.serializable))我觉得是map的中间键a#b#c
![](https://i-blog.csdnimg.cn/blog_migrate/889b406469b124aab6684ee174371e95.png)
merge
将terminatePartial返回的中间部分聚合结果合并到当前聚合中
![](https://i-blog.csdnimg.cn/blog_migrate/143b33a4d7566e8f47dcf8092d61ee0f.png)
terminate
返回最终聚合结果给hive(reduce)
![](https://i-blog.csdnimg.cn/blog_migrate/eac2189b63adf58da2423b7166bd77be.png)
UDAF的运行过程
![](https://i-blog.csdnimg.cn/blog_migrate/164d4901984a9319cf8364969fee50ab.jpeg)