Как просто вывести значение в context.write(k,v)

В моей работе mapreduce я просто хочу вывести несколько строк.

Но если я напишу так: context.write(data, null);

программа выдаст исключение java.lang.NullPointerException.

Я не хочу кодировать, как показано ниже: context.write(data, new Text(""));

потому что я должен обрезать пустое пространство в каждой строке выходных файлов.

Есть ли хорошие способы решить эту проблему? Заранее спасибо.


Извините, это моя ошибка. Я внимательно проверил программу, нашел причину в том, что я установил Редьюсер как объединитель.

Если я не использую объединитель, оператор context.write(data, null); в редукторе работает нормально. В выходном файле данных есть только строка данных.


Поделитесь объяснением NullWritable из полного руководства по Hadoop:

NullWritable — это особый тип Writable, так как он имеет сериализацию нулевой длины. Никакие байты не записываются в поток и не считываются из него. Он используется в качестве заполнителя; например, в MapReduce ключ или значение можно объявить как NullWritable, когда вам не нужно использовать эту позицию — она эффективно сохраняет постоянное пустое значение. NullWritable также может быть полезен в качестве ключа в SequenceFile, когда вы хотите сохранить список значений, а не пары ключ-значение. Это неизменяемый синглтон: экземпляр можно получить, вызвав NullWritable.get().


person HaiWang    schedule 09.04.2013    source источник
comment
Вам не нужно обрезать, если вы используете new Text(). Вы должны обрезать только если вы используете new Text(). Кроме того, API также имеет конструктор Text() по умолчанию.   -  person shazin    schedule 09.04.2013
comment
спасибо, у меня есть попытка.   -  person HaiWang    schedule 09.04.2013


Ответы (1)


Для этой цели следует использовать NullWritable. .

person Quetzalcoatl    schedule 09.04.2013
comment
Спасибо. Я проверил класс NullWritable, он меня устраивает. - person HaiWang; 10.04.2013