版本:
2.2版
描述:
InputFormat是为了读取的时候设置的输入格式,比如我们如果打算在MR的时候读文件那么我们就需要知道文件的路径以及每次mapper多少,InputFormat正是基于这个需求提出来的,也就是定义读取规则。
用途:
1.怎么读
2.从那读
首先看下InputFormat抽象类的定义
public abstract
List<InputSplit> getSplits(JobContext context
) throws IOException, InterruptedException;
public abstract
RecordReader<K,V> createRecordReader(InputSplit split,
TaskAttemptContext context
) throws IOException,
InterruptedException;
那么getSplits中定义的就是从那读,而怎么读是在createRecordReader中定义的,我们可以看下InputSplit的定义:
public abstract long getLength() throws IOException, InterruptedException;
public abstract String[] getLocations() throws IOException, InterruptedException;
其实这个定义如果是接口那么不是很确切,这个准确的来讲是保存数据的地址以及读所用的其他资源因此用新版开始以抽象类形式出现而不是接口,具体的实现还需要根据自己的需要进行相应的添加。
那么读的抽象定义如下:
public abstract void initialize(InputSplit split, TaskAttemptContext context)
throws IOException, InterruptedException;
public abstract boolean nextKeyValue() throws IOException,
InterruptedException;
public abstract KEYIN getCurrentKey() throws IOException,
InterruptedException;
public abstract VALUEIN getCurrentValue() throws IOException,
InterruptedException;
public abstract float getProgress() throws IOException,
InterruptedException;
public abstract void close() throws IOException;
那么这个就可以直接获取到对应的当前Value等数据信息
其他场景:
如果打算以mysql某表的数据作为输入源那么只需要继承此类即可(已经有实现不过需要自己重新定义DBWritable)