根据我的理解TextInputFormat
应该在换行符时完全分开,但根据我在网站上看到的一些答案,我觉得我错了。有没有人有更好的解释,哪个选项是对的?
以下哪项最能说明TextInputFormat
的工作原理?
输入文件拆分可能会跨越换行符。跨越文件拆分的行由包含折线末尾的拆分的RecordReader
读取。
输入文件在换行符处完全分割,因此每个Record Reader都会读取一系列完整的行。
输入文件拆分可能会跨越换行符。跨越文件拆分的行由包含折线开头的拆分的RecordReader
读取。
输入文件拆分可能会跨越换行符。将忽略跨越tile分割的行。
输入文件拆分可能会跨越换行符。跨越文件拆分的行由包含虚线的两个拆分的RecordReaders
读取。
答案 0 :(得分:3)
选项 1。是正确的。第一次拆分的最后一行将是第一次拆分的一部分,即使这会导致远程读取并遭受数据局部性问题。
并不总是可以让线的末端与分割边界重合。
答案 1 :(得分:0)
纯文本文件的InputFormat。文件分为几行。换行或回车用于发出行尾信号。键是文件中的位置,值是文本行。
检查TextInputFormat @ grepcode的实现(选项1似乎是正确的方法)
@Override
public RecordReader<LongWritable, Text>
createRecordReader(InputSplit split,
TaskAttemptContext context) {
return new 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;
}
}