String tag = (FileSplit)context.getInputSplit()).getPath()
.getParent().getName().toString();
context.write(outKey, new Text(tag + "_" + value.toString));
如果您对文件名本身感兴趣(实际上应该是这样),请删除 getParent() 打电话。 减少
String metaFileName = "meta.dat";
for(Text value : values){
String[] tagVal = value.toString().split("_",2);
if(strVal[0].equals(metaFileName){
// process the meta file here // strVal[1] contains the actual value
} else { // process data files }
}
2条答案
按热度按时间4urapxun1#
Reducer
运行在Mappers
,因此中没有有关输入文件的信息Context
在那里。现在来识别里面的输入目录reduce
您只需要在中标记outvaluemap
使用您共享的代码,加入与此无关。如:Map
如果您对文件名本身感兴趣(实际上应该是这样),请删除
getParent()
打电话。减少
这应该能解决你的问题。这里有一个建议,你可以利用
MultiOutputs
从reducer写入不同类型文件的api。否则,在作业结束后,将很难识别元文件(它将分布在多个输出文件中)。5ktev3wc2#
mapreduce作业的输入由
FileInputFormat.addInputPath()
方法。正如方法名称所暗示的addInputPath()
方法可以多次调用以指定其他文件和/或目录作为mapreduce作业的输入。因此,可能有多个路径作为单个mapreduce作业的输入。Map器任务在单个拆分上操作。因此,Map器能够检索正在处理的特定拆分的路径是有意义的。
但是,还原器通常对多个Map器的输出进行操作,这些Map器的输入拆分可能(可能)具有不同的路径。因此,在一个reducer中没有inputsplit的概念,这就是为什么你不能得到它的路径。