1

複数行の入力のMyInputFormatレコード境界の問題に対処することを想定しているカスタムがあります。しかし、UDF ロード関数に入れたとき。次のように:MyInputFormat

import org.apache.hadoop.mapreduce.InputFormat;
public class EccUDFLogLoader extends LoadFunc {
    @Override
    public InputFormat getInputFormat() {
        System.out.println("I am in getInputFormat function");
        return new MyInputFormat();
    }
}

import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
public class MyInputFormat extends TextInputFormat {
    public RecordReader createRecordReader(InputSplit inputSplit, JobConf jobConf) throws IOException {
        System.out.prinln("I am in createRecordReader");
        //MyRecordReader suppose to handle record boundary
        return new MyRecordReader((FileSplit)inputSplit, jobConf);
    }
}

マッパーごとに出力されますが、出力されI am in getInputFormat functionませんI am in createRecordReader。私のコスチューム MyInputFormat を PIG の UDF ローダーに接続する方法について、誰かがヒントを提供できるかどうか疑問に思っています。どうもありがとう。

Amazon EMR で PIG を使用しています。

4

1 に答える 1

1

署名が親クラスの署名と一致しません (Reporter 引数がありません)。これを試してください:

@Override
public RecordReader<LongWritable, Text> getRecordReader(
        InputSplit inputSplit, JobConf jobConf, Reporter reporter)
             throws IOException {
  System.out.prinln("I am in createRecordReader");
  //MyRecordReader suppose to handle record boundary
  return new MyRecordReader((FileSplit)inputSplit, jobConf);
}

編集申し訳ありませんが、以前はこれを見つけていませんでした。お気づきのように、代わりに新しい API 署名を使用する必要があります。

@Override
public RecordReader<LongWritable, Text> 
      createRecordReader(InputSplit split,
             TaskAttemptContext context) {
  System.out.prinln("I am in createRecordReader");
  //MyRecordReader suppose to handle record boundary
  return new MyRecordReader((FileSplit)inputSplit, jobConf);
}

そして、 MyRecordReader クラスはクラスを拡張する必要がありorg.apache.hadoop.mapreduce.RecordReaderます

于 2012-12-19T01:33:05.153 に答える