在我的输入文件中,我有一列作为国家。现在,我的任务是将特定国家的记录放入以该国家命名的单独文件中。这可以在 Map-reduce 中做到吗?!请分享您对此的想法。
10829 次
2 回答
4
是的,在 hadoop 中,您可以使用MultipleOutputFormat它的方法来做到这一点generateFileNameForKeyValue。
使用您的国家名称作为键和记录作为值,这应该完全按照您的需要工作。
于 2013-05-08T10:58:48.763 回答
3
如果您使用新的 API,您应该查看MultipleOutputs类。这个类中有一个例子。
作业提交的使用模式:
工作工作 = 新工作();
FileInputFormat.setInputPath(job, inDir);
FileOutputFormat.setOutputPath(job, outDir);
job.setMapperClass(MOMap.class);
job.setReducerClass(MOReduce.class);
...
// 为作业定义附加的基于单个文本的输出“文本”
MultipleOutputs.addNamedOutput(job, "text", TextOutputFormat.class,
LongWritable.class, Text.class);
// 为作业定义额外的基于序列文件的输出“序列”
MultipleOutputs.addNamedOutput(job, "seq",
SequenceFileOutputFormat.class,
LongWritable.class, Text.class);
...
作业.waitForCompletion(true);
...
在减速机中的用法:
字符串 generateFileName(K k, V v) {
返回 k.toString() + "_" + v.toString();
}
公共类 MOReduce 扩展
减速机{
私有MultipleOutputs mos;
公共无效设置(上下文上下文){
...
mos = new MultipleOutputs(context);
}
public void reduce(WritableComparable key, Iterator values,
上下文上下文)
抛出 IOException {
...
mos.write("text", , key, new Text("Hello"));
mos.write("seq", LongWritable(1), new Text("Bye"), "seq_a");
mos.write("seq", LongWritable(2), key, new Text("Chau"), "seq_b");
mos.write(key, new Text("value"), generateFileName(key, new Text("value")));
...
}
公共无效清理(上下文)抛出 IOException {
mos.close();
...
}
}
于 2013-05-11T17:05:22.857 回答