我正在尝试处理一些数据并将它们输出到不同的目录。我按照这篇文章中接受的答案(使用MultipleOutputs): 将输出写入不同的文件夹hadoop
但是,当我创建多个目录时,输出文件为空(仍然创建目录和文件)。如果我只是删除斜杠(只是同一目录中的不同文件),则文件包含预期的数据。
任何帮助将不胜感激。
代码快照:
在主函数中:
while ((ll = br.readLine())!= null)
{
for (Type v:values)
MultipleOutputs.addNamedOutput(conf, "./"+ll+"/"+v.toString()+"/"+ll, TextOutputFormat.class, Text.class, NullWritable.class);
}
减少类:
public static class Reduce extends MapReduceBase implements Reducer<Text, Text, Text, NullWritable> {
private MultipleOutputs mos;
public void configure (JobConf context)
{
mos = new MultipleOutputs(context);
}
public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, NullWritable> output, Reporter reporter) throws IOException {
while (values.hasNext())
mos.getCollector(key.toString(),
reporter).collect(values.next(),
NullWritable.get());
}
}
生成的密钥与命名输出的格式相同。
我只在 MultipleOutputs 中添加了一行以允许“/”和“。”:
if ((ch=='/') || (ch =='.')) continue;
在 checkTokenName 函数中。强文本