2011-04-29 3 views
1

내 문제를 간소화하기 위해 두 개의 개행 문자로 구분 된 "레코드"가있는 텍스트 파일 집합이 있습니다.텍스트 파일의 텍스트 파일을 Hadoop의 단일 레코드로 처리하기

'여러 줄 문자'

'빈 줄'

'여러 줄 문자'

'빈 줄'

등처럼.

각 다중 선 단위를 개별적으로 변환 한 다음 mapreduce를 수행해야합니다.

그러나 hadoop 코드 상용구의 기본 단어 개수 설정에서 다음 함수의 변수 value에 대한 입력이 단 한 줄에 불과하며 입력이 이전 입력과 연속적이라는 보장이 없음을 알고 있습니다. 선.

public void map(LongWritable key, Text value, 
       OutputCollector<Text, IntWritable> output, 
       Reporter reporter) throws IOException ; 

그리고 입력 value 여러 줄 텍스트를 구분 실제로 이중 줄 바꿈 한 단위라고 할 필요.

일부 검색은 RecordReader 클래스와 getSplits 메서드를 사용했지만 머리를 감쌀 수있는 간단한 코드 예제는 아닙니다.

다른 해결책은 여러 줄 문자의 모든 줄 바꿈 문자를 공백 문자로 바꾸고 그 문자로 끝내는 것입니다. 나는 약간의 텍스트가 있고 실행 시간면에서 시간이 많이 걸리기 때문에 이것을하지 않을 것입니다. 내가 이렇게하면 hadoop을 통해 처리하는 것이 나에게 가장 매력적 일 수 있기 때문에 많은 코드를 수정해야한다.

답변

3

파일 크기가 작은 경우 분할되지 않습니다. 기본적으로 각 파일은 하나의 매퍼 인스턴스에 할당 된 하나의 분할입니다. 이 경우 토마스와 동의합니다. 문자열을 연결하여 매퍼 클래스에 논리 레코드를 만들 수 있습니다. 매퍼에 값으로 들어오는 빈 문자열을 찾아 레코드 경계를 감지 할 수 있습니다.

그러나 파일이 크고 분리되면 다른 옵션이 표시되지 않지만 텍스트 입력 형식 클래스를 구현해야합니다. 기존 Hadoop LineRecordReader 및 LineReader Java 클래스를 복제 할 수 있습니다. 레코드 구분 기호가 하나가 아닌 두 개의 새로운 줄이되도록 LineReader 클래스 버전을 약간 변경해야합니다. 이 작업이 완료되면 매퍼는 입력 값으로 여러 행을 받게됩니다.

+0

답장은 사실 64MB를 초과하는 파일 또는 hadoop이 파일 분할을 시작하는 파일을 처리해야 할 때 유용합니다. – JasonMond

1

무엇이 문제입니까? 이전 줄을 StringBuilder에 넣고 새 레코드에 도달하면 플러시하십시오.
텍스트 파일을 사용할 때 분할되지 않습니다. 이 경우 FileInputFormat을 사용합니다. FileInputFormat은 사용 가능한 파일 수와 병렬 처리 만합니다.

+0

고마워요! 실제로 구현하고 테스트하는 데 시간이 걸렸지 만 당신 말이 맞습니다. – JasonMond

관련 문제