在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 ???
}
谢谢,
3条答案
按热度按时间gywdnpxw1#
您可以通过从buffer operate调用中提供的flowprocess参数获取buffer类中的reporter来实现这一点。
2admgd592#
我不使用级联,但我认为使用functioncall.getcontext()访问上下文示例就足够了,以获得可以使用的文件名:
但是,级联似乎使用了旧的api,如果上面的api不起作用,您必须尝试:
7gcisfzg3#
感谢engineiro分享答案。然而,当调用hfp.getreporter().getinputsplit()方法时,我得到了multiinputsplit类型,它不能在级联2.5.3中直接转换为filesplit类型。在深入研究了相关的级联api之后,我找到了一种方法并成功地检索了输入文件名。因此,我想分享这一点,以补充engineiro的答案。请参阅以下代码。