如何在示例中更改WordCount.java程序中的代码,以便将每个文件的WordCounts输出放在单独的文件中。也就是说,而不是只有一个wordcount所有文件在该默认的part-00000文件中。此外,输出文件的名称始终为part-00000或其他名称,我可以为此文件选择我想要的输出文件名,如果是,如何?
我想我必须以某种方式在主要配置这个,但我搜索了这个,我找不到怎么做?
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length != 2) {
System.err.println("Usage: wordcount <in> <out>");
System.exit(2);
}
Job job = new Job(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
任何帮助表示赞赏, 泰德
答案 0 :(得分:3)
查看属于Hadoop api的MultipleOutputFormat或MultipleOutputs。这些都应该解决你的问题。 MultipleOutputFormat允许您根据键/值的任何部分(或组合)指定文件路径。以下是来自 Hadoop,权威指南的示例:
protected String generateFileNameForKeyValue(NullWritable key, Text value,
String name) {
parser.parse(value);
return parser.getStationId() + "/" + parser.getYear();
}
对于MultipleOutputFormat,所有文件都具有相同的格式,但结果将根据生成的文件名写入不同的文件。
对于MultipleOutputs,您也可以使用多种不同的输出格式保存结果。例如,如果您正在处理具有警告,信息消息和错误的服务器日志,则可以将每种类型的消息保存到不同的文件(通过MultipleOutputs),并以不同方式格式化每种类型的输出。
答案 1 :(得分:0)
每个缩减器都会有一个部分XXXXX文件输出。将mapred.reduce.tasks
调整为适当的数字(通常是您拥有的机器数量的倍数),这就是您将拥有多少输出文件。
就为文件选择名称而言,最简单的方法是在作业完成后重命名。