赞
踩
UDAF实现代码如下:
- public class GetKeyWithMaxValue extends UDAF {
-
- public static class GetKeyWithMaxValue_int_int implements UDAFEvaluator{
- //最终结果
- private HashMap<Integer , Integer > result;
- //负责初始化计算函数并设置它的内部状态,result是存放最终结果的
- @Override
- public void init() {
- result= new HashMap<Integer , Integer >() ;
- }
- //每次对一个新值进行聚集计算都会调用iterate方法
- public boolean iterate(Integer key , Integer value)
- {
- if (result == null )
- result=new HashMap<Integer , Integer >();
-
- if(result.containsKey(key))
- {
- int new_value = result.get(key) ;
- if (new_value < value)
- new_value = value ;
- result.put(key , new_value) ;
- }
- else
- result.put( key , value ) ;
-
- return true;
- }
-
- //Hive需要部分聚集结果的时候会调用该方法
- //会返回一个封装了聚集计算当前状态的对象
- public HashMap<Integer , Integer > terminatePartial()
- {
- return result;
- }
- //合并两个部分聚集值会调用这个方法
- public boolean merge(HashMap<Integer , Integer > other)
- {
- //将 result和other合并
- Iterator<Entry<Integer, Integer>> iter = other.entrySet().iterator();
- while (iter.hasNext()) {
- Map.Entry<Integer , Integer> entry = iter.next();
- int key = entry.getKey();
- int val = entry.getValue();
-
- if(result.containsKey(key))
- {
- int new_value = result.get(key) ;
- if (new_value < val)
- new_value = val ;
- result.put(key , new_value) ;
- }
- else
- result.put( key , val ) ;
- }
- return true ;
- }
- //Hive需要最终聚集结果时候会调用该方法
- public ArrayList<Integer> terminate()
- {
- ArrayList<Integer> res = new ArrayList<Integer>() ;
- //先找出最大的value
- int max_value = Integer.MIN_VALUE ;
- Iterator<Entry<Integer, Integer>> iter = result.entrySet().iterator();
- while (iter.hasNext()) {
- Map.Entry<Integer , Integer> entry = iter.next();
- int val = entry.getValue();
-
- if (val > max_value)
- max_value = val ;
- }
-
- Iterator<Entry<Integer, Integer>> iter2 = result.entrySet().iterator();
- while (iter2.hasNext()) {
- Map.Entry<Integer , Integer> entry = iter2.next();
- int key = entry.getKey();
- int val = entry.getValue();
-
- if (val == max_value)
- res.add(key) ;
- }
- return res ;
- }
- }
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。