2013-01-14 2 views
2

나는 hadoop에 새로 왔습니다. 나는 단어 수로 끝내었고 지금 나는 수정을하고 싶다.hadoop 단어 수와 최대 발생 단어를 얻으십시오.

텍스트 파일에서 가장 많이 발생한 단어를 가져오고 싶습니다.

a 1 
b 4 
c 2 

I 출력을 나에게 여기 만

b 4 

내 감속기 기능 ::

public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> 
{ 

int max_sum=0; 
Text max_occured_key; 

public void reduce(Text key, Iterable<IntWritable> values, Context context) 
    throws IOException, InterruptedException 
    { 
    int sum = 0; 
    for (IntWritable val : values) 
    { 
     sum += val.get();   
    } 
    if(sum > max_sum) 
    { 
     max_sum = sum; 
     max_occured_key = key; 

    } 

    context.write(max_occured_key, new IntWritable(max_sum)); 
    //context.write(key, new IntWritable(sum)); 

    } 

}

을 줄 것이다 프로그램을 쓰고 싶은 : 일반 워드 카운트 프로그램은 출력을 제공하는 경우

하지만 올바른 출력을 제공하지 않습니다. 누구든지 plz를 도울 수 있습니까?

답변

5

각 감소 기능의 끝에서 지금까지 최대 값을 쓰고 있습니다. 따라서 감속기 당 하나 이상의 항목을 얻을 수 있습니다. 또한 키 참조를 (값을 복사하는 대신) max_occured_key 변수에 복사 할 때 참조 재사용 문제가 발생합니다.

다음과 같이 당신은 아마 수정해야

:

  • (빈 텍스트로) 전화 max_occured_key.set(key);를 건설시 max_occured_key 변수를 초기화하는 대신이 지정을 동일 사용 - 키 매개 변수가 재사용되는 참조 reduce 메소드의 모든 반복이므로 실제 객체는 동일하게 유지되며 기본 내용은 반복마다 수정됩니다.
  • method 클린업을 재정의하고 해당 메소드에 대한 context.write 호출을 이동하여 하나의 K, V 출력 감속기 당 쌍. 예를 들어

:

정리 방법은 한 번이라고 모든 데이터는지도를 통과 또는 작업을 감소 (및 (작업 인스턴스에 호출 된
@Override 
protected void cleanup(Context context) { 
    context.write(max_occured_key, new IntWritable(max_sum)); 
} 

그래서 당신은 10 감속기,이 준 경우 . 방법) 각 인스턴스에 대해

+0

덕분에 많은라고하지만 질문이됩니다.. 당신이 당신의 3 점을 exaplin 주실 래요을 ... 내가 을 그 얻을 건설시 max_occured_key를 초기화하지 않았다 선언 의미 WordC 클래스의 공용 변수로 이모? – Ronin

+0

예를 들어 주시겠습니까 ?? – Ronin

+0

예제와 조금 더 설명이 추가되었습니다. 더 자세히 설명 할 것이 필요하면 알려주세요 –