记录读取器拆分,将固定长度转换为分隔的ascii文件

eeq64g8w  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(614)

我有一个128 mb的文件,所以它被分成2个块(块大小=64 mb)。我正在尝试使用自定义记录读取器类将固定长度的文件转换为带分隔符的ascii文件
问题:
当处理文件的第一次拆分时,我能够正确地获取记录当我看到在数据的顶部有一个配置单元表时,它也在访问数据节点2以获取字符,直到记录结束。但是,第二次拆分是以\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字符。
是否也应该将任何值设置为start变量?

xfb7svmp

xfb7svmp1#

我找到了解决这个问题的方法,我在输入的定长文件中有一个可变长度的头文件,它没有被跳过,所以这个位置不是从记录的开头开始的,而是从位置开始的(startofred-headerlength)。这使得每个记录从上一个记录中读取几个字符(与headerlength一样长)。
更新代码:

if ((start % recordByteLength) > 0) {
        pos = start - (start % recordByteLength) + recordByteLength + headerLength;
    }
    else {
        pos = start;            
    }

    fileIn.skip(pos);

相关问题