在map-reduce中,我会提取输入文件名,如下所示
public void map(WritableComparable<Text> key, Text value, OutputCollector<Text,Text> output, Reporter reporter)
throws IOException {
FileSplit fileSplit = (FileSplit)reporter.getInputSplit();
String filename = fileSplit.getPath().getName();
System.out.println("File name "+filename);
System.out.println("Directory and File name"+fileSplit.getPath().toString());
process(key,value);
}
如何使用级联
进行类似操作Pipe assembly = new Pipe(SomeFlowFactory.class.getSimpleName());
Function<Object> parseFunc = new SomeParseFunction();
assembly = new Each(assembly, new Fields(LINE), parseFunc);
...
public class SomeParseFunction extends BaseOperation<Object> implements Function<Object> {
...
@Override
public void operate(FlowProcess flowProcess, FunctionCall<Object> functionCall) {
how can I get the input file name here ???
}
谢谢,
答案 0 :(得分:1)
我不使用Cascading,但我认为使用functionCall.getContext()访问上下文实例应该足以获取可以使用的文件名:
String filename= ((FileSplit)context.getInputSplit()).getPath().getName();
但是,似乎级联使用旧API,如果上述方法不起作用,则必须尝试使用:
Object name = flowProcess.getProperty( "map.input.file" );
答案 1 :(得分:1)
感谢Engineiro分享答案。但是,当调用hfp.getReporter()。getInputSplit()方法时,我得到了MultiInputSplit类型,它不能直接在级联2.5.3中转换为FileSplit类型。在深入了解相关的级联API之后,我找到了一种方法并成功检索了输入文件名。因此,我想与大家分享一下,以补充Engineiro的答案。请参阅以下代码。
HadoopFlowProcess hfp = (HadoopFlowProcess) flowProcess;
MultiInputSplit mis = (MultiInputSplit) hfp.getReporter().getInputSplit();
FileSplit fs = (FileSplit) mis.getWrappedInputSplit();
String fileName = fs.getPath().getName();
答案 2 :(得分:0)
你可以通过在缓冲区操作调用中提供的flowprocess参数中获取缓冲区类中的报告器来完成此操作。
HadoopFlowProcess hfp = (HadoopFlowProcess) flowprocess;
FileSplit fileSplit = (FileSplit)hfp.getReporter().getInputSplit();
.
.//the rest of your code
.