我有一个128 MB的文件,因此将其分为2个块(块大小= 64 MB)。
我正在尝试使用Custom Record Reader类将固定长度文件转换为定界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字符。
是否也应将任何值设置为起始变量?
最佳答案
我找到了解决此问题的方法,我在输入固定长度文件中有一个可变长度的 header ,该 header 没有被跳过,因此该位置不是完全从记录的开头开始,而是从位置(StartofRecord-HeaderLength)开始。这使得每条记录从前一条记录中读取几个字符(与标题长度一样多)。
更新的代码:
if ((start % recordByteLength) > 0) {
pos = start - (start % recordByteLength) + recordByteLength + headerLength;
}
else {
pos = start;
}
fileIn.skip(pos);
关于hadoop - 记录读取器拆分将固定长度转换为定界ASCII文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23664372/