【问题标题】:PIG doesn't read my custom InputFormatPIG 不读取我的自定义 InputFormat
【发布时间】:2012-12-18 23:00:43
【问题描述】:

我有一个自定义的MyInputFormat 来处理multi-lined inputs 的记录边界问题。但是当我将MyInputFormat 放入我的UDF 加载函数时。如下:

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。

【问题讨论】:

  • 尝试在createRecordReader 方法上添加@Override 注释以确保您拥有正确的签名

标签: hadoop user-defined-functions apache-pig amazon-emr


【解决方案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

【讨论】:

  • 如果我放了@Override,那么它会给我错误说MyInputFormat.java:11: method does not override or implement a method from a supertype @Override.
  • 该错误是因为您当前的方法签名没有覆盖父方法。添加 Reporter 参数,你应该没问题
  • Pig getInputFormat 期望 org.apache.hadoop.mapreduce.InputFormat 所以 MyInputFormat 中的 TextInputFormat 来自 org.apache.hadoop.mapreduce.lib.input.TextInputFormat。它没有getRecordReader,而是createRecordReader。这就是我使用createRecordReader 的原因。它仍然给我错误。
  • 或者我不应该扩展TextInputFormat?如果是这样,我应该扩展到哪一个??
  • 你应该扩展 org.apache.hadoop.mapreduce.lib.input.TextInputFormat
猜你喜欢
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多