2013-10-15 2 views
0

Мне нужно переместить сложное значение (реализует Writable) из результата 1-й работы по сокращению карты для ввода другой работы по уменьшению количества карт. Результаты 1-го задания сохранены в файле. Файл может хранить текстовые данные или BytesWritable (с выходными данными по умолчанию). Поэтому мне нужен простой способ конвертировать мой Writable в Text или To BytesWritable и из него. Он существует? Любой альтернативный способ сделать это? Большое спасибоСохраните и прочитайте сложное Записываемое значение в задаче Hadoop

+2

Я сам не пробовал, но вы могли бы написать свой вывод в файл последовательности, тогда вам не нужны конверсии. Возможно, кто-то еще сможет это сделать. Это может заставить вас начать. http://hadoop.apache.org/docs/current/api/org/apache/hadoop/mapred/SequenceFileOutputFormat.html – DDW

ответ

0

Пользователь irW прав, используйте SequenceFileOutputFormat. SequenceFile решает эту проблему, не переходя в Text Writable. При настройке вашей работы, используйте job.setOutputKeyClass и job.setOutputValueClass установить Записываемые подклассы, которые вы используете:

job.setOutputKeyClass(MyWritable1.class); 
job.setOutputValueClass(MyWritable2.class); 
job.setOutputFormatClass(SequenceFileOutputFormat.class); 

Это будет использовать формат Hadoop SequenceFile для хранения Writables. Затем в следующей работе, используйте SequenceFileInputFormat:

job.setInputFormatClass(SequenceFileInputFormat.class); 

затем клавишу ввода и значение для картографа в этой работе будет два Записываемых классов, первоначально указанных в качестве вывода в предыдущей работе.

Обратите внимание, что ваш сложный подкласс Writable выполняется правильно. Помимо того факта, что у вас должен быть пустой конструктор, методы write и readFields должны быть реализованы таким образом, чтобы любые поля Writable в классе также записывали и читали их информацию.

+0

Поскольку я являюсь поклонником сохранения простого, я добавлю это побочное предложение в комментарии. Если вы в любой момент можете захотеть использовать что-либо, кроме Java API, для чтения ваших файлов, вместо этого вы захотите использовать Avro, который является независимым от языка форматом сериализации. Это позволит вам легко обрабатывать ваши данные с помощью полезных инструментов, таких как Pig или любая программа, совместимая с потоковой передачей MapReduce. Я пережил боль от использования SequenceFiles и сожалею об этом, посмотри на этот вопрос: http://stackoverflow.com/questions/18884666/handling-writables-fully-qualified-name-changes-in-hadoop-sequencefile –

Смежные вопросы