我认为我的代码一定有些错误,但我无法找到它。
在我的课程中,我有:
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
任何想法?非常感谢
答案 0 :(得分:1)
结果按发送给Reducer的密钥排序(例如,IE,chrome ...)。您是否注意到第二列按字母顺序排序?
如果要按总和计数对它们进行排序,则需要添加另一个MapReduce步骤并将计数设置为键。
答案 1 :(得分:1)
创建私有实例变量
TreeMap sortedMap = new TreeMap();
而不是做context.write(result,key);在Reducer中,将这些值存储在TreeMap中。 sortedMap.put(sum,key);
在清理方法中,您可以按照您希望的输出方式执行context.write()。 TreeMap对输出进行排序。所以你将实现你想要的。