Reduce统计结果汇总混乱

    在hadoop2.7.1上写了一段MapReduce程序,作一个word cloud统计,程序执行结果中有数据,可是混乱:不少彻底相同的关键字没有归并到一块儿,也有个别的归并到了一块儿,但汇总值没有超过2的,以下:java

        中国红    1oop

        中国红    1spa

        中国红    1code

        摩卡黑    2hadoop

        摩卡黑    2get

    百度说,其余同仁遇到的大可能是reduce没有输出结果,其缘由是Reduce应该用Iterable仍是Iterator形成的,并且仍是0.19和0.20版本时代的问题。而我有结果输出,只是没有彻底执行合计。Reduce代码以下:it

 static class MyReducer extends
   Reducer<Text, LongWritable, Text, LongWritable> {
  LongWritable result = new LongWritable();
  public void reduce(Text key, Iterable<IntWritable> values,
    Context context) throws IOException, InterruptedException {
   int sum = 0;
   for (IntWritable val : values) {
    sum += val.get();
   }
   result.set(sum);
   context.write(key, result);
  }
 }

莫非对Reduce处理中文Key有问题?不太可能。遂将全部Key用URLEncoder转码,结果仍然同样,不能归并。查半天,未果。io

一觉醒来,突然发现程序import中居然还有IntWritable,我曾经把全部Int改为了LongWritable,这个程序居然漏了!看上面代码中Class定义中使用了LongWritable,计算的时候却使用的IntWritable,修改,再运行,归并正常。table

    原来如此!Map和Reduce的数据类型不匹配一般会有ClassCastException,但LongWritable和IntWritable的转换没有报异常,默默的计算错了,居然!ast

相关文章
相关标签/搜索