我写了map reduce程序,根据" key"查找顶部单词。我使用HashMap来收集reducer输出并进行一些比较以得到顶级单词,最后我使用cleanup()方法来打印输出。但是当我看到结果时它没有显示键中的聚合值。
这是我的减速机代码。
所以,请帮我解决这个问题,因为从过去的几天开始,我一直在努力做到这一点。
public class top5reduce extends Reducer<IntWritable,Text,IntWritable,Text>
{
Map<Integer,Text> map=new HashMap<Integer,Text>();
public void reduce(Iterable<IntWritable> key,Text value,Context context) throws IOException, InterruptedException,NullPointerException
{
int sum1=0;
for(IntWritable key2:key)
{
sum1 +=key2.get();
}
map.put(sum1,value);
}
protected void cleanup(Context context)
{
int key=0;
Text val=null;
Map<Integer,Text> map1=new TreeMap<Integer,Text>(new Comparator<Integer>()
{
public int compare(Integer o1,Integer o2)
{
return o2.compareTo(o1);
}
});
map1.putAll(map);
Set<Map.Entry<Integer,Text>> set=map1.entrySet();
for(Map.Entry<Integer,Text> entr:set)
{
key=entr.getKey();
val=entr.getValue();
}
try {
context.write(new IntWritable(key), val);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
答案 0 :(得分:0)
我认为你的reduce函数存在一些问题。当您尝试聚合每个键时,您必须遍历所有值并添加它们。尝试下面的代码并查看它是否有效。
public void reduce(IntWritable key,Iterable<IntWritable> value,Context context) throws IOException, InterruptedException,NullPointerException
{
int sum1=0;
for(IntWritable key2:value)
{
sum1 +=key2.get();
}
map.put(key,sum1);
}