hadoop的reduce函数传入的key和value分别共享同一对象

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));
            }
        }
}

标签: hadoop的reduce函数传入的key和value分别共享同一对象

添加新评论