根据我的理解,TextInputFormat
应该在换行符处准确分割,但根据我在网站上看到的一些答案,我似乎错了。谁有更好的解释,哪个选项是正确的?
下列哪一项最好地描述了TextInputFormat
的工作原理?
-
输入文件分割可能会交叉换行。
分隔符的 输入文件在换行符处精确分割,因此每个Record Reader将读取一系列完整的行。
输入文件分割可能会交叉换行。跨文件分割的行由分割的
RecordReader
读取,该分割包含折线的开头。输入文件分割可能会交叉换行。
输入文件分割可能会交叉换行。
如果横贯文件分割,则由包含折线的两个分割的
RecordReader
将读取穿过文件分隔符的行。
RecordReaders
读取。选项1。是正确的。第一次拆分的最后一行将成为第一次拆分的一部分,尽管这会导致远程读取并遭受数据局部性问题。
不可能总是使行尾与分割边界一致
查看TextInputFormat的文档页
用于纯文本文件的InputFormat。文件被分成几行。换行符或回车符用于表示行结束。键是文件中的位置,值是文本行。
检查TextInputFormat @grepcode的实现(选项1似乎是正确的方式)
@Override
public RecordReader<LongWritable, Text>
createRecordReader(InputSplit split,
TaskAttemptContext context) {
return new LineRecordReader();
}
LineRecordReader:
public boolean nextKeyValue() throws IOException {
if (key == null) {
key = new LongWritable();
}
key.set(pos);
if (value == null) {
value = new Text();
}
int newSize = 0;
while (pos < end) {
newSize = in.readLine(value, maxLineLength,
Math.max((int)Math.min(Integer.MAX_VALUE, end-pos),
maxLineLength));
if (newSize == 0) {
break;
}
pos += newSize;
if (newSize < maxLineLength) {
break;
}
// line too long. try again
LOG.info("Skipped line of size " + newSize + " at pos " +
(pos - newSize));
}
if (newSize == 0) {
key = null;
value = null;
return false;
} else {
return true;
}
}