2015-06-16 4 views
0
**a 10 20 30      a 60 
            b 155 
            c 50 
    b 20 45 90 
    z 30 10 10 

Вышеупомянутый текстовый файл с разделителями в виде вкладок. Мне нужна общая сумма чисел в строке. И выход должен быть таким, как изображено выше.Hadoop добавление номеров

Я попытался использовать следующий код карты и редуктора, но он не работает. Может кто-нибудь исправить код пожалуйста ??

код Mapper:

public class WordMapper extends MapReduceBase implements Mapper<LongWritable,Text,Text,IntWritable>{ 

@Override 
public void map(LongWritable key, Text value, 
     OutputCollector<Text, IntWritable> output, Reporter arg3) 
     throws IOException { 
    String s = value.toString(); 
     for(String word:s.split("\t")){ 
      if(word.length()>0){ 
       output.collect(new Text(word),new IntWritable(1)); 
    // TODO Auto-generated method stub 

      } 
     } 
    } 
} 

Reducer Код:

public class WordReducer extends MapReduceBase implements Reducer<Text,IntWritable,Text,IntWritable>{ 
public void reduce(Text key, Iterator<IntWritable> values, 
     OutputCollector<Text, IntWritable> output, Reporter reporter) 
     throws IOException { 
    int sum = 0; 
    while(values.hasNext(){ 
     if values != null{ 
     sum += values.next().get(); 
    } 
    output.collect(key, new IntWritable(sum)); 

    } 
} 
+0

как это не удается? какой результат вы получаете? –

ответ

0

output.collect в 'редуктор' должен быть вне цикла. Затем ваш код должен выдавать желаемый результат.

+0

Я не мог комментировать из-за лимита репутации, поэтому отправил ответ вместе с запросом от человека, который отправил комментарий ранее. Я могу отредактировать ответ? –

3

Вы отправляете неверный ключ и значения в редуктор. Вот почему вы не можете получить сумму чисел. Вы должны изменить свой код сопоставителя на что-то вроде этого:

@Override 
 
\t public void map(LongWritable key, Text value, 
 
\t \t \t OutputCollector<Text, IntWritable> output, Reporter arg3) 
 
\t \t \t throws IOException { 
 
\t \t 
 
\t  \t String s = value.toString(); 
 
\t   String[] splits = s.split("/t"); 
 
\t   String newKey = splits[0].trim(); 
 
\t   for(int i=1;i<splits.length;i++) { 
 
\t   \t output.collect(new Text(newKey), new IntWritable(Integer.parseInt(splits[i].trim()))); 
 
\t   } 
 
\t    
 

 
\t }

+0

Это работает для меня, спасибо @MChirukuri. –

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