Hadoop映射器从2个不同的源输入文件读取

时间:2012-07-15 20:05:34

标签: hadoop mapreduce

我有很多Mappers& amp; Reducers,在某些时候我需要先前map-reduce步骤的合并结果,例如作为输入我有两个带数据的文件:

/input/a.txt
apple,10
orange,20

*/input/b.txt*
apple;5
orange;40

结果应为c.txt,其中<​​strong> c.value = a.value * b.value

/output/c.txt
apple,50   // 10 * 5
orange,800 // 40 * 20

怎么做?我已经通过引入简单的Key =&gt;解决了这个问题。 MyMapWritable(type = 1,2,value),以及reducers中的合并(实际上,乘法)数据。它有效,但是:

  1. 感觉它可以做得更容易(气味不好)
  2. 是否有可能以某种方式知道Mapper内部哪个文件被用作记录提供者(a.txt或b.txt)。现在,我只使用了不同的分隔符:昏迷和放大器。分号:(

2 个答案:

答案 0 :(得分:3)

假设它们已经以相同的方式进行了分区和排序,那么您可以使用CompositeInputFormat来执行map-side-join。有一篇关于使用它的文章here。我不认为它已被移植到新的mapreduce api中。

其次,您可以通过调用context.getInputSplit()来获取映射器中的输入文件,这将返回InputSplit,如果您使用的是TextInputFormat,则可以转换为FileInputSplit然后调用getPath()获取文件名。我不认为你可以在CompositeInputFormat中使用这个方法,因为你不知道TupleWritable中Writables的来源。

答案 1 :(得分:1)

String fileName = ((FileSplit) context.getInputSplit()).getPath()
                .toString();

if (fileName.contains("file_1")) {
   //TODO for file 1
} else {
   //TODO for file 2
}