public static class IntSumReducer extends Reducer<Text, Text, Text, IntWritable> {
private List<Text> list=null;
@Override
protected void setup(Reducer<Text, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
list=new ArrayList<Text>();
}
@Override
public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
for (Text value : values) {
//错误的写法,reduce的key和value分别共享同一对象,每次迭代的时候,只是更新了这个共享对象的值,如果直接引用此对象,该list中所有的对象的值都会变成最后一次迭代的value的值
list.add(value);
//正确的写法,应该将value复制出一个新的对象,key同理
list.add(new Text(value));
}
}
@Override
protected void cleanup(Reducer<Text, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
for(Text obj:list){
context.write(obj, new IntWritable(1));
}
}
}