Hadoop代码测试环境:Hadoop2.4
应用:在对数据需要进行一定条件的过滤和简单处理的时候可以使用自定义输入文件格式类。
Hadoop内置的输入文件格式类有:
1)FileInputFormat<K,V>这个是基本的父类,我们自定义就直接使用它作为父类;
2)TextInputFormat<LongWritable,Text>这个是默认的数据格式类,我们一般编程,如果没有特别指定的话,一般都使用的是这个;key代表当前行数据距离文件开始的距离,value代码当前行字符串;
3)SequenceFileInputFormat<K,V>这个是序列文件输入格式,使用序列文件可以提高效率,但是不利于查看结果,建议在过程中使用序列文件,最后展示可以使用可视化输出;
4)KeyValueTextInputFormat<Text,Text>这个是读取以Tab(也即是\t)分隔的数据,每行数据如果以\t分隔,那么使用这个读入,就可以自动把\t前面的当做key,后面的当做value;
5)CombineFileInputFormat<K,V>合并大量小数据是使用;
6)MultipleInputs,多种输入,可以为每个输入指定逻辑处理的Mapper;
原理:
InputFormat接口有两个重要的函数:
1)getInputSplits,用于确定输入分片,当我们继承FileInputFormat时,就可以忽略此函数,而使用FileInputFormat的此函数即可;
2)createRecordReader ,针对数据如何读取的类,定义输入文件格式,其实也就是定义此类;
在每个map函数中,最开始调用的都是nextKeyValue()函数,这个函数就是在RecordReader中定义的(我们自定义RecordReader就是使用不同的实现而已),所以这里会调用我们指定的RecordReader中的nextKeyValue函数。这个函数就会处理或者说是初始化key和value,然后返回true,告知已经处理好了。接着就会调用getCurrentKey 和getCurrentValue获取当前的key和value值。最后,返回map,继续执行map逻辑。
自定义输入文件格式类:
package fz.inputformat;
import java.io.IOException;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.InputSplit;
import org.apache.hadoop.mapreduce.RecordReader;
import org.apache.hadoop.mapreduce.TaskAttemptContext;
import org.apache.had