0

ich eine Mapperfunktion geschrieben haben, die die XML und gibt das Ergebnis als Spalten separted durch „\ t“, wie unten dargestelltDistributing Hadoop Streaming Ausgabedateien auf Basis von Keys

Name Age 
ABC 23 
XYZ 24 
ERT 25 

Mit dem Hadoop Streaming-Code parst als unten erwähnt, versuche ich die Daten auf der Basis von Schlüssel zu partitionieren. Ich möchte verschiedene Ausgabe-Ordner für verschiedene Schlüssel erstellen, dh

Statt Teile-00000, Teil-00001 und Teil-00003 als die Ausgabedateien im Ausgabeordner "out_parse_part16", Ich möchte die Ordner wie erstellt werden dieses
/out_parse_part16/ABC,

/out_parse_part16/XYZ,

/out_parse_part16/ERT

ich mag die Daten in verschiedenen Ordnern mit den Tasten definiert partitioniert werden. Gibt es eine Möglichkeit, dies zu tun, indem ich Output-Ordner in meinem Reducer-Code basierend auf Schlüsseln erstelle?

/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 
+0

Haben Sie bei dieser Antwort sah: http://stackoverflow.com/questions/18541503/multiple-output-files-for-hadoop-streaming-with-python-mapper –

+0

Hey. Danke, dass du dir das angeschaut hast. Ich habe den Link durchgemacht, den du geteilt hast. Das Problem ist, dass ich meine Ausgabe als Avro speichern und -outputformat org.apache.avro.mapred.AvroTextOutputFormat verwende, das ich in meiner Frage nicht erwähnt habe. Entschuldigung dafür. Kann ich es irgendwie mit meinem Reducer Code machen? –

+0

Wie im obigen Beispiel müssten Sie das 'AvroTextOutputFormat' erweitern, um zu steuern, wie die Dateien aufgerufen werden. Es könnte möglich sein. Das 'OutputFormat' erweitert' FileOutputFormat', sodass Sie sich überlegen müssen, welche Methoden in dieser Klasse überschrieben werden sollen. Es könnte möglich sein. –

Antwort

0

Ich denke, Sie brauchen ein Glas wie folgt.

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 ; 
    } 

}