我正在尝试将(键和值)写入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);
答案 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");