首先还是先讲下hadoop的文件输入经过这么个过程处理的,文件——>splits划分成N多inputsplit(这就是每个mapper处理的数据单元)——>RecordReader划分成M多<key,value>对(每次map()函数处理的数据单元)。hadoop默认使用的是TextInputFormat的格式继承了FileInputFormat,要实现自己的文件输入格式,就需要继承FileInputFormat类.。hadoop是通过RecordReader来实现key,value的读取的,默认使用的是LineRecordReader(实现了RecordReader接口)。 自定义的文件输入格式还是很有必要的,看自己的需要可以分为几个粒度,这里主要对每一行文本获取自己的key value对。在继承FileInputFormat类中实现自己的Reader类,举例如下:
public class ImageInputFormat extends FileInputFormat<Text, ImageVector> {
private final static Pattern p = Pattern.compile("([^,]+,)|([^,]+)");
static class Reader extends RecordReader<Text, ImageVector> {
public Text key;
private ImageVector value;
private final LineRecordReader r;
private long start;
public Reader() {
key=new Text();
r = new LineRecordReade