在我的输入文件中,我有一列作为国家。现在,我的任务是将特定国家的记录放入以该国家命名的单独文件中。这可以在 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 回答