2012-12-20 2 views
1

파일을 Pig에로드하기 위해 UDF를 작성했습니다. 그것은 텍스트 파일을로드하는 데 잘 작동하지만 지금은 .gz 파일을 읽을 수 있어야합니다. 파일을 압축 해제하고 처리 할 수 ​​있음을 알고 있지만 압축을 풀지 않고 .gz 파일을 읽으 려합니다.PIG UDF로드 .gz 파일이 실패했습니다.

내 UDF를 LoadFunc에서 확장하고 내 costom 입력 파일 MyInputFile extends TextInputFormat을 확장했습니다. 나는 또한 MyRecordReader을 구현했다. 그냥 TextInputFormat 확장 경우 궁금해? FileInputFormat을 시도했지만 여전히 파일을 읽을 수 없습니다. 누구든지 전에 파일 .gz에서 UDF 읽기 데이터를 썼습니다?

+1

'TextInputFormat'은 gzip 파일을 처리 할 수 ​​있습니다. 적절한 CompressionCodec이 초기화되는 RecordReader ('LineRecordReader')'initialize()'메소드를보십시오. 또한 gzip 파일은 분할 할 수 없습니다. –

+0

감사합니다. splittable이 아니라면 먼저 압축을 풀 것을 고려할 것입니다. 파일을 미리 압축 해제 한 다음 PIG에로드하는 것이 가장 좋습니다. 이렇게하는 가장 좋은 방법은 무엇입니까? 감사. –

+0

데이터 크기를 알지 못하면 가장 쉬운 방법은 hundfs에 _uncompressed_ 데이터를 저장하는 것입니다. 분할 가능한 형식 ('LZO')을 사용하여 다시 포장 할 수도 있습니다. gzip 파일을 추출하는 방법; 로컬 디스크 -> HDFS, 참조 : http://bigdatanoob.blogspot.hu/2011/07/copy-and-uncompress-file-to-hdfs.html. 이미 hdfs에 있다면 :'hadoop fs -cat /data/data.gz | gzip -d | hadoop fs -put -/data/data.txt' –

답변

0

TextInputFormat은 gzip 파일 으로 처리합니다. RecordReader (LineRecordReader) initialize() 메서드를 살펴보고 적절한 CompressionCodec이 초기화됩니다. 또한 gzip 파일 은 분할 가능 형식 (예 : LZO) 또는 원하는 수준의 병렬 처리를 이용하기 위해 압축되지 않은 데이터를 사용해야 할 수도 있으므로 (S3에있는 경우에도 해당) 분할 할 수 없습니다.

gzip으로 압축 된 데이터를 로컬에 저장 한 경우 here과 같이 한 번에 압축을 풀고 hdfs로 복사 할 수 있습니다. 또는 이미 hdfs에있는 경우
hadoop fs -cat /data/data.gz | gzip -d | hadoop fs -put - /data/data.txt이 더 편리 할 것입니다.

+0

그건 그렇고, 만약 HDFS에서 S3에서 .gz 파일을 읽고 HDFS에 저장하고 싶다면,'hadoop fs -cat s3n : //yourbuckets/yourfile.gz | gzip -d> yourfile.txt'. –