2012-07-15 25 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 
} 
相關問題