一、OutputFormat 介绍
OutputFormat 是 MapReduce 输出的基类,所有实现 MapReduce 输出都实现了 OutputFormat 接口。下面说一下几种常见的 OutputFormat 实现类。
1、TextOutputFormat
默认的输出格式为 TextOutputFormat,它把每条记录写为文本行。它的键和值可以是任意类型,因为 TextOutputFormat 调用 toString() 方法把它们转换为字符串。
2、SequenceFileOutputFormat
将 SequenceFileOutputFormat 输出作为后续 MapReduce 任务的输入,这便是一种较好的输出格式,因为它的格式紧凑,很容易被压缩。
3、自定义 OutputFormat
根据用户需求,自定义实现输出。
二、自定义 OutputFormat
2.1 使用场景和使用说明
1、使用场景
为了实现控制最终文件的输出路径和输出格式,可以自定义 OutputFormat。
例如:要在一个 MR 程序中根据数据的不同,输出两类结果到不同路径,这样比较灵活的需求可以自定义 OutputFormat 来实现
2、使用说明
(1) 自定义一个类继承 FileOutputFormat
(2) 改写 RecordWriter,重写 write() 方法
2.2 案例操作
1、需求
过滤输入的 log 日志,包含 atguigu 的网站输出到 F:/atguigu.log,不包含 atguigu 的网站输出到 F:/other.log。
2、数据说明
(1) 输入数据
http://www.baidu.com
http://www.google.com
http://cn.bing.com
http://www.atguigu.com
http://www.sohu.com
http://www.sina.com
http://www.sin2a.com
http://www.sin2desa.com
http://www.sindsafa.com
(2) 期望输出数据
http://www.atguigu.com
http://cn.bing.com
http://www.baidu.com
http://www.google.com
http://www.sin2a.com
http://www.sin2desa.com
http://www.sina.com
http://www.sindsafa.com
http://www.sohu.com
3、流程分析
4、编写代码
(1) 编写 FilterMapper 类
package customoutputformat;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
/**
* @description: 编写 FilterMapper 类
* @author: hyr
* @time: 2020/2/28 19:22
*/
public class FilterMapper extends Mapper<LongWritable, Text, Text, NullWritable> {
@Override
protected void map(LongWritable key