写入hadoop中的多个文件夹?

时间:2013-10-11 22:19:43

标签: hadoop

我正在尝试将我的输出从reducer分离到不同的文件夹..

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的/部分-R-0001

我该怎么做? 感谢

1 个答案:

答案 0 :(得分:4)

如果你的意思是MultipleOutputs,最简单的方法就是从你的减速器中做到以下其中一种 -

  1. 使用带有基本输出路径的命名输出。 See this function
  2. 没有命名输出且仅使用基本输出路径See this function
  3. 在您的情况下,它是第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点,实际上不需要任何命名输出。

    如果需要,请回复我的进一步说明。