Я знаю, что вкладка по умолчанию входного разделитель для полей:Hadoop 2.4.0 потоковых общие опции анализатора с использованием TAB в качестве разделителя
stream.map.output.field.separator
stream.reduce.input.field.separator
stream.reduce.output.field.separator
mapreduce.textoutputformat.separator
но если я пытаюсь написать универсальный вариант синтаксического анализатора:
stream.map.output.field.separator=\t (or)
stream.map.output.field.separator="\t"
, чтобы проверить, как hadoop анализирует символы пробела, такие как «\ t, \ n, \ f» при использовании в качестве разделителей. Я заметил, что hadoop читает его как символ \ t, но не «». Я проверил это, печатая каждую строку в редукторе (питон), как он читает с помощью:
sys.stdout.write(str(line))
Мой картографа выделяет пары ключ/значение, как: key value1 value2
используя print (key,value1,value2,sep='\t',end='\n')
команду.
Так я ожидал мой редуктор читать каждую строку как: key value1 value2
тоже, но вместо этого sys.stdout.write(str(line))
напечатало:
key value1 value2 \\with trailing space
Из Hadoop streaming - remove trailing tab from reducer output, я понял, что тянущееся пространство обусловлено не mapreduce.textoutputformat.separator
быть установлено и слева по умолчанию.
Таким образом, это подтвердило мое предположение о том, что Hadoop считал мой общий объем карты:
key value1 value2
в качестве ключа и значения, как пустой объект Text, так как он прочитал разделитель из stream.map.output.field.separator=\t
как «\ т» символ вместо "" вкладка сама.
Пожалуйста, помогите мне понять это поведение и как я могу использовать \ t как разделитель, если захочу.
Я не указываю номер поля в своем аргументе, и AFAI понял, проблема, о которой вы говорили, возникает только в том случае, если я предоставляю номер поля, и если я дам меньше, чем мой номер предполагаемого поля. Я не понял часть «поля, связанные с разделением». Интересно, что я отлаживал исходный код Hadoop 2.4.0 в «PipeMapper.java»: строка «mapOutputFieldSeparator = job.get» («stream.map.output.field.separator», «\ t»). GetBytes («UTF-8»); 'выводит' t' omitting \ character, когда я даю 'stream.map.output.field.separator = \ t' в качестве аргумента и' TAB' (белые символы) при отсутствии аргумента. – annunarcist
Попробуйте добавить параметр "stream.map.output.field.separator" значение "\ t", в вашем java-коде задания. Не знаю, почему у него проблемы с доставкой из другого места. – Ramzy
Это потоковая работа. Мы можем передавать только mappers/reducers как скрипты/исполняемые файлы, и я использую скрипты python для своего картографа и редуктора.Здесь мы не можем получить доступ к объекту задания. – annunarcist