MultipleOutputs map reduce不起作用

时间:2014-03-13 05:29:52

标签: hadoop mapreduce

我正在尝试将(键和值)写入reducer中的不同文件,但我只获得了一个键和值的输出文件。

 public static class Reduce
   extends Reducer<Text,Text,Text,Text> {
  private MultipleOutputs <Text,Text>mos;
@Override
protected void setup(Context context) throws IOException,           InterruptedException {      
    super.setup(context);
}
public void reduce(Text key, Text values, Context context ) throws IOException, InterruptedException {      
     mos.write(key.toString(),values, key); }  

@Override
    protected void cleanup(Context context) throws IOException,
            InterruptedException {
        super.cleanup(context);
    }   
}// end Reducer 

//驱动程序:它包含多个输出

    job.setMapperClass(Map.class);
    job.setReducerClass(Reduce.class);
    job.setCombinerClass(Reduce.class);
    job.setInputFormatClass(TextInputFormat.class);
    job.setOutputFormatClass(TextOutputFormat.class);
    // set output key type   
    job.setOutputKeyClass(Text.class);
    // set output value type
    job.setOutputValueClass(Text.class);
    //set the HDFS path of the input data
    FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
    // set the HDFS path for the output
    FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
   //multiple output files
    MultipleOutputs.addNamedOutput(job, "express", TextOutputFormat.class, Text.class, Text.class);

1 个答案:

答案 0 :(得分:0)

write类的MultipleOutputs方法有三个签名,如下所示。

write(KEYOUT key, VALUEOUT value, String baseOutputPath) 
           Write key value to an output file name.

write(String namedOutput, K key, V value) 
          Write key and value to the namedOutput.

write(String namedOutput, K key, V value, String baseOutputPath) 
           Write key and value to baseOutputPath using the namedOutput

您似乎正在使用第二个,但更改键和值参数。另外,如果您传递整个值Iterable,我不知道此方法的行为。

作为建议,您可以使用更简单的第三个签名,因为您不需要拨打addNamedOutput并且只能写入任何baseOutputPath

例如:

mos.write(key, value, "express");