我有一个128 MB的文件,因此它被拆分为2个块(块大小= 64 MB)。 我正在尝试使用自定义记录阅读器类
将固定长度文件转换为定界ASCII文件问题:
当处理文件的第一次拆分时,我能够正确地获取记录,当我看到数据顶部的hive表时,它也访问数据node2以获取字符,直到记录结束。 但是,第二次拆分以\ n字符开头,并且记录数量也增加了一倍。
Ex:
First Split: 456 2348324534 34953489543 349583534
Second Split:
456 23 48324534 34953489543 349583534
作为记录阅读器的一部分,为了跳过在第一个输入分割中读取的字符,添加以下代码
FixedAsciiRecordReader(FileSplit genericSplit, JobConf job) throws IOException {
if ((start % recordByteLength) > 0) {
pos = start - (start % recordByteLength) + recordByteLength;
}
else {
pos = start;
}
fileIn.skip(pos);
}
输入固定长度文件在每条记录的末尾都有一个\ n字符。
是否应将任何值设置为起始变量?
答案 0 :(得分:0)
我找到了这个问题的解决方案,我的输入固定长度文件中有一个可变长度的标题,没有被跳过,所以位置不是从记录的开头开始,而是从位置开始(StartofRecord - HeaderLength)。这使得每条记录读取前一条记录中的几个字符(与标题长度一样多)。
更新代码:
if ((start % recordByteLength) > 0) {
pos = start - (start % recordByteLength) + recordByteLength + headerLength;
}
else {
pos = start;
}
fileIn.skip(pos);