Mapreduce计算,输出时key的值都是一个,而且都是最后一个put进入的值!
原因:
Key-Value对象的重用导致的:Key是一个引用,它在栈中,指向堆中一个对象,同样Value也是如此。虽然reduce方法会反复执行多次,但key和value相关的对象只有两个,key和value的引用也是只有两个,reduce会反复重用这两个对象。所以put进去的key指向的对象只有一个,对象的值为最后一个put进去的值,所以输出的key的值都为最后一个。
解决:
如果要保存key或者value的结果,只能将其中的值取出另存或者重新clone一个对象(例如Text text= new Text(value) 或者 String a = value.toString()),而不能直接赋引用。因为引用从始至终都是指向同一个对象,如果直接保存它们,那最后它们都指向最后一个输入记录。会影响最终计算结果而出错。
案例:
输出:
修改后的代码:
输出: