我想我的代码一定有问题,但我找不到。
在我的课程中,我有:
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
你知道吗?非常感谢
2条答案
按热度按时间yx2lnoni1#
创建私有示例变量
而不是做context.write(result,key);在reducer中,将这些值存储在treemap中。
sortedMap.put(sum,key);
在cleanup方法中,可以按您希望的方式执行context.write()。树Map对输出进行排序。所以你将实现你所期待的。ecbunoof2#
结果按发送到减速器的键排序(例如,chrome…)。你注意到第二列是按字母顺序排列的吗?
如果要按总和计数对它们进行排序,则需要添加另一个mapreduce步骤并将计数设置为键。