【问题标题】:how to get input file name in hadoop cascading如何在hadoop级联中获取输入文件名
【发布时间】:2014-06-02 20:58:56
【问题描述】:

在 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 ???    
}

谢谢,

【问题讨论】:

    标签: java hadoop mapreduce cascading


    【解决方案1】:

    我不使用 Cascading,但我认为使用 functionCall.getContext() 访问上下文实例就足够了,以获得您可以使用的文件名:

    String filename= ((FileSplit)context.getInputSplit()).getPath().getName();
    

    但是,级联似乎使用旧的 API,如果上述方法不起作用,您必须尝试:

    Object name = flowProcess.getProperty( "map.input.file" );
    

    【讨论】:

      【解决方案2】:

      感谢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();
      

      【讨论】:

        【解决方案3】:

        您可以通过从缓冲区操作调用中提供的流程参数获取缓冲区类中的报告器来做到这一点。

        HadoopFlowProcess hfp = (HadoopFlowProcess) flowprocess; 
        
        FileSplit fileSplit = (FileSplit)hfp.getReporter().getInputSplit();
        .
        .//the rest of your code
        .
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-10-01
          • 1970-01-01
          • 2015-04-28
          • 1970-01-01
          • 1970-01-01
          • 2013-02-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多