我正在使用map-reduce中的单词计数示例进行一些修改。我将reducer中迭代器的值复制到列表中,以检查数字是正数还是负数,以便分别对它们求和。问题是当它们存储在列表中时我无法获取值。我得到零作为总和的总数,如下所示:
Hello 0
World 0
reducer的代码:
public static class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
int sum = 0;
int listSize=0;
boolean isPos=false;
boolean isNeg=false;
List<Integer> l=new ArrayList<Integer>();
int size=Iterators.size(values);
while (values.hasNext()) {
l.add(values.next().get());
}
for(int i=0; i<l.size();i++) {
if(l.get(i)==-1) {isNeg=true;}
else if(isNeg!=true && l.get(i)!=-1) isPos=true;
}
if(isNeg==true) {
for(int i=0; i<l.size();i++) {
l.add(i, -1);
}
}
for(int i=0; i<l.size();i++) {
sum+=l.get(i);
}
if(isNeg) {sum=sum+1;}
if(isPos) {sum=sum-1;}
if(sum>0) {sum=sum-1;}
else if (sum<0){sum=sum+1;}
output.collect(key, new IntWritable(sum));}
}
当我将代码返回到此时,我得到了数字的总和,但在将它们复制到列表时我无法访问这些值。
while (values.hasNext()) {
sum+=values.next().get());
}