Распространение выходных файлов Hadoop Streaming на основе ключей

Я написал функцию сопоставления, которая анализирует XML и выводит результат в виде столбцов, разделенных «\ t», как показано ниже.

Name Age
ABC   23
XYZ   24
ERT   25

Используя код потоковой передачи Hadoop, как указано ниже, я пытаюсь разделить данные на основе ключа. Я хочу сделать разные выходные папки для разных ключей, т.е.

Вместо того, чтобы получать part-00000 , part-00001 и part-00003 в качестве выходных файлов в выходной папке «out_parse_part16», я хочу, чтобы папки были созданы следующим образом
/out_parse_part16/ABC,

/out_parse_part16/XYZ,

/out_parse_part16/ERT

Я хочу, чтобы данные были разделены на разные папки, определенные ключами. Есть ли способ сделать это, создав выходные папки в моем коде редуктора на основе ключей?

/opt/cloudera/parcels/CDH-5.5.2-1.cdh5.5.2.p0.4/bin/hadoop jar /opt/cloudera/parcels/CDH-5.5.2-1.cdh5.5.2.p0.4/jars/hadoop-streaming-2.6.0-cdh5.5.2.jar \
-Dstream.recordreader.begin="<START_REC>" \
-Dstream.recordreader.end="</START_REC>" \
-D mapred.job.name="parse_with_partition"  \
-D stream.num.map.output.key.fields=1 \
-D map.output.key.field.separator=\t \
-D mapred.text.key.partitioner.options="-k1nr" \
-inputreader "org.apache.hadoop.streaming.StreamXmlRecordReader,begin =<START_REC>,end=</START_REC>" \
-file csv_parser_part.py \
-mapper csv_parser_part.py \
-file csv_part_reducer.py \
-reducer /csv_part_reducer.py \
-input TEST_XML2.xml \
-output out_parse_part16 \
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner \
-verbose

person Rohit Guglani    schedule 13.06.2016    source источник
comment
Вы смотрели на этот ответ: stackoverflow.com/questions/18541503/   -  person Binary Nerd    schedule 13.06.2016
comment
Привет. Спасибо, что изучили это. Я прошел по ссылке, которой вы поделились. Проблема в том, что я сохраняю свой вывод как Avro и использую -outputformat org.apache.avro.mapred.AvroTextOutputFormat, который я не упомянул в своем вопросе. Извинения за это. Есть ли способ сделать это, используя мой код редуктора?   -  person Rohit Guglani    schedule 13.06.2016
comment
Как и в приведенном выше примере, вам нужно будет расширить AvroTextOutputFormat, чтобы контролировать, как называются файлы. Это возможно. Этот OutputFormat расширяет FileOutputFormat, поэтому вам нужно посмотреть, какие методы переопределить в этом классе. Это возможно.   -  person Binary Nerd    schedule 13.06.2016


Ответы (1)


Я думаю, вам нужна такая банка.

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.lib.MultipleTextOutputFormat;

public class TestMultipleOutputFormat extends MultipleTextOutputFormat<Text, Text> {  

    protected String generateFileNameForKeyValue(Text key, Text value, String name)   
    {  
        String strValue = value.toString();  
        String outputName = name;  
        return outputName ; 
    }  

}
person zhimu    schedule 17.06.2016