一、概述
- MapReduce结束阶段,OutputFormat类决定了Reducer如何产生输出
- Hadoop本身提供了若干内置的OutputFormat
- 如果不明确指定默认使用TextOutputFormat
二、常见子类
- TextOutputFormat - 以行分隔、包含制表符定界的键值对的文本文件格式
- SequenceFileOutputFormat - 二进制键值数据的压缩格式
- SequenceFileAsBinaryOutputFormat - 原生二进制数据的压缩格式
- MapFileOutputFormat - 一种使用部分索引键的格式
- MultipleOutputFormat - 使用键值对参数写入文件的抽象类
- MultipleTextOutputFormat - 输出多个以标准行分割、制表符定界格式的文件
- MultipleSequenceFileOutputFormat - 输出多个压缩格式的文件
- DBOutputFormat - 将数据以指定形式写到数据库中
三、自定义输出格式
概述
- 所有的OutputFormat都要直接或间接的继承OutputFormat抽象类
- OutputFormat抽象类中定义了如下的抽象方法:getRecordWriter(TaskAttemptContext context) , checkOutputSpecs(JobContext context )以及getOutputCommitter(TaskAttemptContext context)
- 如果输出的目的地是文件,则可以继承FileOutputFormat,这个类中实现了checkOutputSpecs和getOutputCommitter方法,并将getRecordWriter()设置为抽象方法要求子类实现
- 如果想要更精细的改变逻辑可以自己去编写getOutputCommitter和checkOutputSpecs方法
四、多源输出
public class MoutMapper extends Mapper<LongWritable, Text, Text, Text> {
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
String[] arr = line.split(" ");
context.write(new Text(arr[0]), new Text(arr[1]));
}
}
public class MoutReducer extends Reducer<Text, Text, Text, Text> {
private MultipleOutputs<Text, Text> mo;
@Override
protected void setup(Reducer<Text, Text, Text, Text>.Context context) throws IOException, InterruptedException {
mo = new MultipleOutputs<>(context);
}
public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
String name = key.toString();
Text value = values.iterator().next();
if (name.charAt(0) <= 'I')
mo.write("a2i", key, value);
else
mo.write("j2z", key, value);
}
}
public class MoutDriver {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "JobName");
job.setJarByClass(cn.tedu.multiout.MoutDriver.class);
job.setMapperClass(MoutMapper.class);
job.setReducerClass(MoutReducer.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);
FileInputFormat.setInputPaths(job, new Path("hdfs://192.168.32.147:9000/txt/score2.txt"));
FileOutputFormat.setOutputPath(job, new Path("hdfs://192.168.32.147:9000/result4"));
MultipleOutputs.addNamedOutput(job, "a2i", TextOutputFormat.class, Text.class, Text.class);
MultipleOutputs.addNamedOutput(job, "j2z", TextOutputFormat.class, Text.class, Text.class);
if (!job.waitForCompletion(true))
return;
}
}