2012-07-15 59 views
3

我有一个链接大量Mappers的工具& Reducers,并且在某些时候我需要合并来自之前map-reduce步骤的结果,例如作为输入我有两个带有数据的文件:Hadoop映射器从2个不同的源输入文件中读取

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

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

结果应该c.txt,其中c.value = a.value中* b.value

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

如何才能做到?我已经通过简单的Key => MyMapWritable(type = 1,2,value)解决了这个问题,并在reducer中合并(实际上是乘法)数据。它的工作原理,但:

  1. 有感觉,它可以做更容易(气味不好)
  2. 是否有可能以某种方式知道里面映射究竟哪些文件被用作记录提供商(A.TXT或b。文本)。现在,我只是用不同的分隔符:昏迷&分号:(

回答

3

假设他们已经被分割并以同样的方式进行排序,那么你可以使用CompositeInputFormat执行map端联接有一篇文章。其次,你可以通过调用context.getInputSplit()得到映射器中的输入文件,这将返回InputSplit,如果你是使用它的话使用TextInputFormat,您可以投射到FileInputSplit,然后拨打getPath()来获取文件名。我认为您不能使用此方法CompositeInputFormat,但你不知道TupleWritable中的Writable来自哪里。

+0

断链条:( – 2014-02-08 13:05:34

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

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