上图是InputFormat的派生子类关系图,这篇主要讲解FileInputDormat的实现类——>TextInputFormat
由于InputFormat是一个抽象类,不同的实现类,分片机制不同,如下图:
TextInputFormat 继承了FileInputFormat 如下代码:
public class TextInputFormat extends FileInputFormat<LongWritable, Text> {
@Override
public RecordReader<LongWritable, Text>
createRecordReader(InputSplit split,
TaskAttemptContext context) {
String delimiter = context.getConfiguration().get(
"textinputformat.record.delimiter");
byte[] recordDelimiterBytes = null;
if (null != delimiter)
recordDelimiterBytes = delimiter.getBytes(Charsets.UTF_8);
return new LineRecordReader(recordDelimiterBytes);
}
@Override
protected boolean isSplitable(JobContext context, Path file) {
final CompressionCodec codec =
new CompressionCodecFactory(context.getConfiguration()).getCodec(file);
if (null == codec) {
return true;
}
return codec instanceof SplittableCompressionCodec;
}
}
发现TextInputFormat 并没有重写getSplits() 方法,所以他的切片机制和FileInputFormat切片机制一样。
TextInputFormat是默认的FileInputFormat的实现类。按行读取每条记录。键是存储该行在整个文件中的其实字节偏移量,LongWritable类型。值是这行的内容,不包括任何行终止符(换行符和回车符)Text类型。