6

出力をレデューサーから別のフォルダーに分離しようとしています..

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

出力/foobar/part-r-0001

どうすればいいですか?ありがとう

4

1 に答える 1

4

このMultipleOutputsを意味する場合、最も簡単な方法は、リデューサーから次のいずれかを実行することです-

  1. ベース出力パスで名前付き出力を使用する。この関数を参照してください
  2. 名前付き出力なしでベース出力パスのみを使用,この関数を参照してください

あなたの場合、それはポイント1なので、次を変更してください-

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

に、

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");

ここで、「foo/part」「bar/part」「foobar/part」は baseOutputPath に対応します。したがって、ディレクトリ foo、bar、および foobar が作成され、そのpart-r-xxxxxファイル内に作成されます。

上記のポイント 2 を試すこともできますが、実際には名前付き出力は必要ありません。

必要に応じて、さらに明確にするために私に戻ってきてください.

于 2013-10-12T01:34:41.930 に答える