有時候需要在Map類中的map函數中擷取目前split所讀取的檔案名。
在舊版mapred下面實作方法如下:
// 獲得輸入檔案的路徑名
String path=((FileSplit)reporter.getInputSplit()).getPath().toString();
//使用Reporter reporter對象來擷取,在新版mapreduce中,
Reporter reporter被封裝在類MapContext中(StatusReporter reporter),
在map函數中就是Context context,實作方法應該類似,有興趣的朋友可以試試。
-----------分割線----------->
import org.apache.hadoop.mapreduce.InputSplit;
import org.apache.hadoop.mapreduce.lib.input.FileSplit;
InputSplit inputSplit = context.getInputSplit();
String fileName = ((FileSplit) inputSplit).getPath().toString();
剛剛搜尋了下,新版中實作如下(轉載,未測試,方法應該正确)
以下轉載:
在mapper中擷取目前正在處理的HDFS檔案名/HDFS目錄名
有時候,Hadoop是按行來對資料進行處理的,由于對每一行資料,map()函數會被調用一次,我們有時可以根據檔案名/目錄名來擷取一些資訊,進而把它們輸出,例如,目錄名中包含了日期,則我們可以取出來并輸出到Reducer。在map()函數中,我們可以這樣取檔案名:
1 2 | |
假設目前正在處理的HDFS檔案路徑為:/user/hadoop/abc/myFile.txt,則上面的 fileName 取到的是“myFile.txt”這樣的字元串。但如果要擷取其目錄名“abc”,則可以這樣做:
1 2 | |