我想一定是我的代码有问题,但是我找不到。
在我的程序中我有:
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对输出进行排序。