3.2.4 InputFormat 接口实现类
MapReduce 任务的输入文件一般是存储在 HDFS 里面。输入的文件格式包括:基于行
的日志文件、二进制格式文件等。这些文件一般会很大,达到数十 GB,甚至更大。那么
MapReduce 是如何读取这些数据的呢?下面我们首先学习 InputFormat 接口。
InputFormat 常 见 的 接 口 实 现 类 包 括 :
TextInputFormat 、 KeyValueTextInputFormat 、 NLineInputFormat 、 CombineTextInputFormat
和自定义 InputFormat 等。
1)TextInputFormat
TextInputFormat 是默认的 InputFormat。每条记录是一行输入。键 K 是 LongWritable 类
型,存储该行在整个文件中的字节偏移量。值是这行的内容,不包括任何行终止符(换行
符和回车符)。
以下是一个示例,比如,一个分片包含了如下 4 条文本记录。
Rich learning form
Intelligent learning engine
Learning more convenient
From the real demand for more close to the enterprise
每条记录表示为以下键/值对:
(0,Rich learning form)
(20,Intelligent learning engine)
(49,Learning more convenient)
(75,From the real demand for more close to the enterprise)
很明显,键并不是行号。一般情况下,很难取得行号,因为文件按字节而不是按行切
分为分片。
计算公式:字符个数+空格+偏移量(自占一位)1
2)KeyValueTextInputFormat
每一行均为 一 条 记录,被分隔 符 分 割为 key , value 。 可以通过在 驱 动 类 中设置
conf.set(KeyValueLineRecordReader.KEY_VALUE_SEPERATOR, " ");来设定分隔符。默认分
隔符是 tab(\t)。
job.setInputFormatClass(KeyValueTextInputFormat.class);