2

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

ありがとう、

4

3 に答える 3

1

Cascading は使用しませんが、使用できるファイル名を取得するには、functionCall.getContext() を使用してコンテキスト インスタンスにアクセスするだけで十分だと思います。

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

ただし、カスケードは古い API を使用しているようです。上記が機能しない場合は、次を試す必要があります。

Object name = flowProcess.getProperty( "map.input.file" );
于 2012-12-11T05:07:45.563 に答える
1

回答を共有してくれた Engineiro に感謝します。しかし、hfp.getReporter().getInputSplit() メソッドを呼び出すと、カスケード 2.5.3 で FileSplit 型に直接キャストできない MultiInputSplit 型を取得しました。関連するカスケード API に飛び込んだ後、方法を見つけて、入力ファイル名を正常に取得しました。したがって、これを共有して、Engineiro の回答を補足したいと思います。次のコードを参照してください。

HadoopFlowProcess hfp = (HadoopFlowProcess) flowProcess;
MultiInputSplit mis = (MultiInputSplit) hfp.getReporter().getInputSplit();
FileSplit fs = (FileSplit) mis.getWrappedInputSplit();
String fileName = fs.getPath().getName();
于 2014-06-02T12:58:56.713 に答える