2013-10-11 5 views
6

Ich versuche, meine Ausgabe von Minderer in verschiedenen Ordnern zu trennen ..Schreiben in mehrere Ordner in hadoop?

My dirver has the following code: 
FileOutputFormat.setOutputPath(job, new Path(output)); 
      //MultipleOutputs.addNamedOutput(job, namedOutput, outputFormatClass, keyClass, valueClass) 
      //MultipleOutputs.addNamedOutput(job, namedOutput, outputFormatClass, keyClass, valueClass) 
      MultipleOutputs.addNamedOutput(job, "foo", TextOutputFormat.class, NullWritable.class, Text.class); 
      MultipleOutputs.addNamedOutput(job, "bar", TextOutputFormat.class, Text.class,NullWritable.class); 
      MultipleOutputs.addNamedOutput(job, "foobar", TextOutputFormat.class, Text.class, NullWritable.class); 

And then my reducer has the following code: 
mos.write("foo",NullWritable.get(),new Text(jsn.toString())); 
mos.write("bar", key,NullWritable.get()); 
mos.write("foobar", key,NullWritable.get()); 

But in the output, I see: 

output/foo-r-0001 
output/foo-r-0002 
output/foobar-r-0001 
output/bar-r-0001 


But what I am trying is : 

output/foo/part-r-0001 
output/foo/part-r-0002 
output/bar/part-r-0001 

Ausgabe/foobar/Teil-r-0001

Wie kann ich das tun? Dank

+1

Welche Version von Hadoop ist das? –

Antwort

4

Wenn Sie diese MultipleOutputs bedeuten, wäre die einfachste Art und Weise eine der folgenden Möglichkeiten zu tun, von Ihnen Minderer -

  1. genannt Ausgang Unter Verwendung mit einer Basisausgabepfad. See this function.
  2. Ohne Namen Ausgang und nur eine Basis Papierweg, See this function

In Ihrem Fall ist es Nummer 1, so dass die folgenden, bitte ändern -

mos.write("foo",NullWritable.get(),new Text(jsn.toString())); 
mos.write("bar", key,NullWritable.get()); 
mos.write("foobar", key,NullWritable.get()); 

zu,

mos.write("foo",NullWritable.get(),new Text(jsn.toString()), "foo/part"); 
mos.write("bar", key,NullWritable.get(), "bar/part"); 
mos.write("foobar", key,NullWritable.get(), "foobar/part"); 

Wo, "foo/part", "bar/part" und "foobar/part" entspricht dem baseOutputPath. Daher würden Verzeichnisse foo, bar und foobar erstellt werden und innerhalb dieser Teil-r-xxxxx Dateien.

Sie könnten auch Punkt 2 oben versuchen, die tatsächlich keine benannte Ausgabe benötigen.

Bitte kontaktieren Sie mich bei Bedarf für weitere Informationen.