【问题标题】:Record Reader Split to convert Fixed Length to Delimited ASCII file记录阅读器拆分以将固定长度转换为分隔的 ASCII 文件
【发布时间】:2014-05-14 20:20:37
【问题描述】:

我有一个 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 变量设置任何值?

【问题讨论】:

    标签: hadoop mapreduce hadoop2


    【解决方案1】:

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

    更新代码:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-19
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 2020-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多