2014-10-24 6 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 ключ вместо:

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); 
     } 
    } 
} 

Хотя большинство MapReduce примеров использования StringTokenizer, это чище и желательно использовать String.split метод. Поэтому внесите соответствующие изменения.

+0

Спасибо, что это работает :) – user1929483

Смежные вопросы