2014-10-24 2 views
1

저는 MapReduce를 처음 접했고 누군가 MapReduce를 사용하여 단어 길이 빈도를 수행 할 수있는 아이디어를 줄 수 있는지 물어보고 싶습니다. 나는 이미 단어 수에 대한 코드를 가지고 있지만 단어 길이를 사용하고 싶었습니다. 이것은 지금까지 가지고있는 것입니다.MapReduce 찾을 단어 길이 주파수

public class WordCount { 

public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> { 
    private final static IntWritable one = new IntWritable(1); 
    private Text word = new Text(); 

public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { 
    String line = value.toString(); 
    StringTokenizer tokenizer = new StringTokenizer(line); 
    while (tokenizer.hasMoreTokens()) { 
     word.set(tokenizer.nextToken()); 
     context.write(word, one); 
    } 
} 

}

감사합니다 ... 워드 길이 주파수에 대한

+1

예를 들어 설명해 주시겠습니까? –

+0

SE에 오신 것을 환영합니다. 더 나은 서비스를 제공하기위한 사례와 노력을 공유하십시오. 당신이 올린 코드는 똑바로'Ctrl + c'와'Ctrl + v' 인 것처럼 보입니다! 저것을 피하십시오. – blackSmith

답변

1

, tokenizer.nextToken()key로 방출 할 수 없습니다. 해당 문자열의 길이를 실제로 고려해야합니다. 그래서 코드는 다음과 같은 변화를 잘 할 및 충분합니다

word.set(String.valueOf(tokenizer.nextToken().length())); 

당신이 깊은 모양을 제공하는 경우 지금, 당신은 작동하지만 Mapper 출력 키가 더 이상 Text을 할 수없는 것을 알게 될 것이다. 더 나은 대신 IntWritable 키를 사용하십시오 MapReduce 대부분의 예제는 StringTokenizer을 사용하지만

, 그것은 String.split 방법을 사용하여 깨끗하고 권할
public static class Map extends Mapper<LongWritable, Text, IntWritable, IntWritable> { 
    private final static IntWritable one = new IntWritable(1); 
    private IntWritable wordLength = new IntWritable(); 

    public void map(LongWritable key, Text value, Context context) 
      throws IOException, InterruptedException { 
     String line = value.toString(); 
     StringTokenizer tokenizer = new StringTokenizer(line); 
     while (tokenizer.hasMoreTokens()) { 
      wordLength.set(tokenizer.nextToken().length()); 
      context.write(wordLength, one); 
     } 
    } 
} 

. 그에 따라 변경하십시오.

+0

고맙습니다. :) – user1929483

관련 문제