我希望输出文件的格式为2012117-part-r-00000。基本上我希望输出文件附加日期,以便我可以根据日期排列文件。我查看了OutputFormat和FileOutputFormat,但它对我的情况没有帮助。
答案 0 :(得分:5)
MR作业的输出文件名没有太大的灵活性。使用MultipleOutputFormat的子类。
必须实现MultipleOutputFormat#generateFileNameForKeyValue方法,忽略此方法的输入并返回date + -part-r- + mapred.task.partition
模式中的字符串。 mapred.task.partition是一个int,所以它必须预先用0填充。
答案 1 :(得分:5)
我刚刚找到了新的API,我可以使用org.apache.hadoop.mapreduce.lib.output.MultipleOutputs和方法addNamedOutput()
答案 2 :(得分:4)
有两种方法可以更改输出文件名。
1。使用Java类MultipleOutputFormat。
// job.setOutputFormatClass(TextOutputFormat.class);
LazyOutputFormat.setOutputFormatClass(job, TextOutputFormat.class);
MultipleOutputs.addNamedOutput(job,“20180318”, TextOutputFormat.class, Text.class, IntWritable.class);
2。使用
job.getConfiguration().set(“mapreduce.output.basename”, “20180318”);
答案 3 :(得分:1)
可以通过在Mapper / Reducer类中使用多输出格式来实现。例如:
import org.apache.hadoop.mapreduce.lib.output.MultipleOutputs;
在Mapper / Reducer类中创建MultipleOutputs的对象。
private MultipleOutputs<Text, NullWritable> _multipleOutputs;
在设置中,您可以执行以下操作:
_multipleOutputs = new MultipleOutputs<Text, NullWritable>(context);
然后,在map / reduce方法中,您可以执行以下操作:
_multipleOutputs.write(new Text(whatever you want to emit),new Text(whatever you want to emit),"xyz-m");
这将为您提供xyz-m-00000等文件名。
答案 4 :(得分:0)
如果要在输出文件后附加日期,请使用 MultipleOutputs Apache Hadoop
以下是使您熟悉的示例代码:
MultipleOutputs<Text, Text> mos;
@Override
public void setup(Context context) {
mos = new MultipleOutputs(context);
}
private IntWritable totalCommits = new IntWritable();
@Override
public void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
int Count = 0;
for (IntWritable val : values) {
Count += val.get();
}
totalCommits.set(Count);
String[] keySplit = key.toString().split(",");
mos.write(new Text(keySplit[1]), new Text(totalCommits.toString()),keySplit[0]);
}
@Override
protected void cleanup(Context context) throws IOException, InterruptedException {
mos.close();
}
写入方法应按以下顺序设置参数:键,值,文件名。
键和值类型应与代码第一行中的类型声明相同,文件名应为字符串。请注意,您不能在文件名中使用特殊字符,例如“-”,“:”等。