Если вы используете потоковую передачу Hadoop, ваш ввод может быть в любом строковом формате; Ваш ввод данных мапперов и редукторов происходит из sys.stdin, который вы читаете любым удобным для вас способом. Вам не нужно использовать поля, разделенные табуляцией по умолчанию (хотя по моему опыту один формат должен использоваться среди всех задач для согласованности, когда это возможно).
Однако, используя сплиттер и секционер по умолчанию, вы не можете управлять тем, как ваши входные и выходные данные разделены или отсортированы, поэтому ваши преобразователи и преобразователи должны решить, является ли любая конкретная строка строкой заголовка или строкой данных, используя только эту строку они не будут знать исходные границы файла.
Вы можете указать разделитель, который позволяет мапперу предположить, что первая строка ввода является первой строкой в файле, или даже отойти от строкового формата. Это было трудно сделать в последний раз, когда я пытался использовать Streaming, и, по моему мнению, задачи мапперов и редукторов должны быть независимыми от ввода для эффективности и возможности повторного использования - лучше думать о потоке входных записей, а не отслеживать границы файлов.
Еще одна опция потоковой передачи - это отправка информации заголовка в отдельный файл, который входит в ваши данные. Он будет доступен вашим картографам и редукторам в их рабочих каталогах. Одна идея заключалась бы в том, чтобы связать каждую строку с соответствующей информацией заголовка в исходной задаче, возможно, используя три поля в строке вместо двух, а не связывая их по файлу.
В общем, попробуйте обработать ввод как поток и не полагаться на границы файла, размер ввода или порядок. Все эти ограничения могут быть реализованы, но за счет сложности. Если вам нужно их реализовать, сделайте это в начале или в конце цепочки задач.
Если вы используете Jython или SWIG, у вас могут быть другие варианты, но я нашел, что с ними сложнее работать, чем Streaming.