为什么我在使用Mapreduce时得到了一个混乱的结果



我想一定是我的代码有问题,但是我找不到。

在我的程序中我有:

public static class BrowserMapper extends
        Mapper<LongWritable, Text, Text, IntWritable>

public static class BrowserReduce extends
        Reducer<Text, IntWritable, IntWritable, Text> {
    private IntWritable result = new IntWritable();
    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(result, key);
    }
}

我的工作配置如下:

public int run(String[] args) throws Exception {
    Job job = Job.getInstance();
    job.setMapOutputKeyClass(Text.class);
    job.setMapOutputValueClass(IntWritable.class);
    job.setOutputKeyClass(IntWritable.class);
    job.setOutputValueClass(Text.class);
    job.setMapperClass(BrowserMapper.class);
    job.setReducerClass(BrowserReduce.class);
    job.setInputFormatClass(TextInputFormat.class);
    job.setOutputFormatClass(TextOutputFormat.class);
    FileInputFormat.setInputPaths(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    job.setJarByClass(LogAnalysis.class);
    job.waitForCompletion(true);
    return 0;
}

当我运行这个作业时,我得到了如下的结果:

175394  IE
1475014 chrome
508390  firefox
23566   opera
421729  other
1266627 safari

但是预期的结果是这样的:

1475014 chrome
1266627 safari
508390  firefox
421729  other
175394  IE
23566   opera

你知道吗?非常感谢

结果按发送给Reducer的key排序(例如:, IE, chrome…)。你注意到第二列是按字母顺序排列的吗?

如果您想按总和计数排序,您需要添加另一个MapReduce步骤,并将计数设置为键

创建私有实例变量

TreeMap sortedMap = new TreeMap();

不做context。写(因此,键);在你的Reducer中,将这些值存储在TreeMap中。sortedMap.put(sum,key);

在清理方法中,您可以按照您想要的输出方式执行context.write()。TreeMap对输出进行排序。

相关内容

  • 没有找到相关文章

最新更新