2015-05-27 4 views
5

Я знаю, что вкладка по умолчанию входного разделитель для полей: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 как разделитель, если захочу.

ответ

0

Возможно, у вас есть эта проблема "-D stream.map.output.field.separator =." указывает «.». как разделитель полей для выходов карты, а префикс до четвертого «.» в строке будет ключ, а остальная часть строки (исключая четвертую «.») будет значением. Если строка имеет менее четырех «.» S, тогда вся строка будет ключом, а значение будет пустым текстовым объектом (например, созданным новым текстом («»)).Here ясно упоминается, как используется разделитель, а также о том, как многие из таких вложений разделителя необходимо учитывать при идентификации ключа карты и значения. Также есть поля, относящиеся к разбиению на разделы, на основе которых будет обрабатываться редуктор. Поскольку вы хотите, чтобы разделитель был изменен, я думаю, вам нужно проверить это также на разделении и редукторе.

+0

Я не указываю номер поля в своем аргументе, и 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

+0

Попробуйте добавить параметр "stream.map.output.field.separator" значение "\ t", в вашем java-коде задания. Не знаю, почему у него проблемы с доставкой из другого места. – Ramzy

+0

Это потоковая работа. Мы можем передавать только mappers/reducers как скрипты/исполняемые файлы, и я использую скрипты python для своего картографа и редуктора.Здесь мы не можем получить доступ к объекту задания. – annunarcist