有時候需要在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()函數中,我們可以這樣取文件名:
InputSplit inputSplit = context.getInputSplit();
String fileName = ((FileSplit) inputSplit).getName();
假設當前正在處理的HDFS文件路徑為:/user/hadoop/abc/myFile.txt,則上面的 fileName 取到的是“myFile.txt”這樣的字符串。但如果要獲取其目錄名“abc”,則可以這樣做:
1
2
|
InputSplit inputSplit = context.getInputSplit();
String dirName = ((FileSplit) inputSplit).getPath().getParent().getName();
|