记录阅读器拆分将固定长度转换为定界ASCII文件

时间:2014-05-14 20:20:38

标签: hadoop mapreduce hadoop2

我有一个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字符。

是否应将任何值设置为起始变量?

1 个答案:

答案 0 :(得分:0)

我找到了这个问题的解决方案,我的输入固定长度文件中有一个可变长度的标题,没有被跳过,所以位置不是从记录的开头开始,而是从位置开始(StartofRecord - HeaderLength)。这使得每条记录读取前一条记录中的几个字符(与标题长度一样多)。

更新代码:

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

    fileIn.skip(pos);