2014-01-11 2 views
0

Я пишу mapreduce с Hadoop. В методе уменьшения, я хочу использовать context.write(). Но вывод - это тип int. Как я могу это сделать? Когда я использую context.write(), он показывает ошибку:как написать значения int в редукторе хауопа

Второй аргумент не может быть int.

Это мой код:

public void reduce(Text key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException { 

      int count = 0; 

      for (NullWritable nullWritable : values) { 
       count++; 
      } 

      //context.write(key, count); 
} 

Это позволяет сократить отсчитывает что-то. Затем он должен написать переменную ключа и счетчика.

Как я могу это сделать?

Ответ

Я нашел мой ответ. Я должен новый a IntWritable класс и использовать его метод (set (intValue)).

Как следующий код:

IntWritable c = new IntWritable(); 
    public void reduce(Text key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException { 

       int count = 0; 


       for (NullWritable nullWritable : values) { 
        count++; 
       } 

       c.set(count); 
       context.write(key, c); 

      } 

ответ

0

Вы можете также использовать его как это:

context.write(key,new IntWritable(count)); 
+0

Спасибо. Но он отнимает память! Если ваш вызов вызвал много раз, он создавал новый объект и тратил память ... однако спасибо;) – Amir

+0

Ваш редуктор будет называться столько раз, сколько в ваших данных есть уникальные ключи. NB. В любом случае, это не занимает столько памяти, сколько требуется для карты, а mapreduce - это интенсивные задачи памяти и процессора, поэтому вы должны помнить об этом – Jijo

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