PIG 不读取我的自定义 InputFormat

Posted

技术标签:

【中文标题】PIG 不读取我的自定义 InputFormat【英文标题】:PIG doesn't read my custom 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 注释以确保您拥有正确的签名 【参考方案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

以上是关于PIG 不读取我的自定义 InputFormat的主要内容,如果未能解决你的问题,请参考以下文章

Pig 多个存储命令创建重复工作

MapReduce之自定义InputFormat

大数据之Hadoop(MapReduce):自定义InputFormat

Jquery 无法读取 Internet Explorer 上的自定义标记文本

Pig 无法读取自己的中间数据

具有单元格引用输入的自定义函数