2012-12-28 84 views
0

我開發了一個代碼,該代碼運行map reduce作業以從FTP服務器讀取文件並將其寫入HDFS。進入HDFS它將文件從FTP寫入指定的輸出目錄,並將其命名爲part-0000。如果我在FTP服務器上有多個文件,我將它們全部寫入HDFS中的那部分0000文件。將MapReduce作業的部分0000文件命名爲hadoop中的輸入文件

爲了避免這種情況,我計劃將文件的名稱作爲關鍵字,並將數據作爲值傳遞。因此,reducer將數據輸入到輸出文件中,其中鍵爲文件的名稱。

據我所知,我必須使用延伸MultipleTextOutputFormatoutputformat。我寫它如下

static class MultiFileOutput extends MultipleTextOutputFormat<Text, Text> { 

     protected String generateFileNameForKeyValue(Text key, Text value,String name) { 
      System.out.println("key is :"+ key.toString()); 
     System.out.println("value is :"+ value.toString()); 
      System.out.println("name is :"+ name.toString()); 

       return key.toString(); 
     } 

但我無法通過正在處理的輸入文件的名稱。我如何獲得輸入文件的名稱?

map.input.file 

FileSystem fs = file.getFileSystem(conf); 
       String fileName=fs.getName(); 

不返回輸入文件的名稱。
任何指針?

+0

周圍的一些工作,我已經找到了一些東西,現在我的問題範圍縮小到這一步之後,如何讓輸入目錄中輸入文件名被處理? – RadAl

回答

0

我在下面的代碼爲我定製的輸入格式不會拆分輸入文件中使用FileStatus對象。它的工作對我罰款..

FileSystem fs = file.getFileSystem(conf); 
        FileStatus status= fs.getFileStatus(file); 
        String fileName=status.getPath().toString(); 
0

您可以通過上下文獲取輸入文件路徑。

FileSplit fileSplit = (FileSplit) context.getInputSplit(); 
String inputFilePath = fileSplit.getPath().toString(); 

這將給出完整路徑。如果你想只是文件名,你可以這樣做:

String inputFileName = fileSplit.getPath().getName(); 

HTH

相關問題