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

标签 hadoop mapreduce hadoop2

我有一个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/

相关文章:

Hadoop - 解压缩的 zip 文件

hadoop-yarn - yarn 应用程序-列表 : How to filter list for today or last 24 hours?

java - Hadoop 在 Ubuntu 14 上安装 2.6.0 - Java 错误

apache-spark - 这个简单的例子是Spark还是Hadoop?

hadoop - 无法打开cloudera管理器

hadoop - 当mapred.job.shuffle.input.buffer.percent=0.70时pig join在reducer中出现OutOfMemoryError

hadoop -/etc/bin/hadoop 是同步调用吗?

hadoop - clr配额 : Cannot clear namespace quota on root

hadoop - 如何在 Hadoop 中高效地将一个大数据集分割成多个小文件

python - 重用两个 MapReduce 作业的输出并将结果连接在一起