2012-12-18 3 views
1

multi-lined inputs에 대한 레코드 경계 문제를 처리하는 것으로 가정되는 사용자 지정 MyInputFormat이 있습니다. 그러나 MyInputFormat을 내 UDF로드 기능에 넣었을 때. 다음과 같이 :PIG가 내 사용자 지정 InputFormat을 읽지 않습니다

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 로더에 연결하는 방법에 대한 힌트를 제공 할 수 있는지 궁금합니다. 고마워.

아마존 EMR에서 PIG를 사용하고 있습니다.

+0

시도를 확장 할 필요가있다 'createRecordReader' 메쏘드에서'@Orride' 메쏘드에 주석을 달아 올바른 서명을 보장합니다 –

답변

1
귀하의 서명이 부모 클래스 (당신은 리포터 인수를 놓치고)의 일치하지 않는

,이 시도 :

@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 클래스를

+0

@Override를 넣으면 오류가납니다.'MyInputFormat.java:11 : 메쏘드가 슈퍼 타입의 메쏘드를 오버라이드하거나 구현하지 않습니다 @ Override.' –

+0

현재 methof 서명이 상위 메소드를 대체하지 않기 때문에 오류가 발생합니다. Reporter 인수를 추가하면 OK입니다. –

+0

돼지의'getInputFormat'은'org.apache.hadoop.mapreduce.InputFormat'을 기대합니다. 그래서'MyInputFormat'의'TextInputFormat'은'org.apache.hadoop.mapreduce.lib '입니다. input.TextInputFormat'. 그리고'getRecordReader'가 아니라'createRecordReader'를 가지고 있습니다. 그래서'createRecordReader'를 사용합니다. 그리고 그것은 여전히 ​​나에게 오류를 준다. –

관련 문제