В моей работе 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().