如何处理inputsplit的多行记录?

问题描述:

我有100 TB的一个文本文件,它具有多条记录。我们没有给出每个记录需要多少行。一条记录可以是5行,其他可能是6行,另一条可能是4行。它不确定每条记录的线路大小可能会有所不同。如何处理inputsplit的多行记录?

所以我不能使用默认的TextInputFormat,我写了我自己的inputformat和一个自定义的记录阅读器,但我的困惑是:当发生分裂时,我不确定每个分裂是否包含完整记录。记录的某些部分可以在分裂1中进行,另一部分在分裂2中进行。但这是错误的。

所以,你能不能建议如何让我保证,我全力去记录在一个InputSplit处理这种情况?

在此先感谢 -JE

你需要知道,如果记录实际上是由人物的一些已知序列分隔。

如果你知道这一点,你可以设置textinputformat.record.delimiter配置参数来分隔记录。

如果记录不字符分隔,你需要一些额外的逻辑,例如,统计已知数量的字段(如果有领域的已知数量),并提出,作为一个记录。这通常会使事情变得更加复杂,容易出错和缓慢,因为还有很多文本处理正在进行。

尝试确定是否记录被分隔。也许发布几个记录的简短例子会有所帮助。

在你的记录的读者,你需要定义一个算法,通过它可以:

  • 确定您在记录中间
  • 如何扫描了该记录和读取下一个完整记录

这与TextInputFormat LineReader已经做了什么相似 - 当输入拆分具有偏移量时,行记录读取器从该偏移量开始向前扫描找到的第一个换行符,然后将该换行符之后的下一个记录读取为首先记录我t会发射。系着这一点,如果块长度达不到EOF的,行记录读者会高达和过去块的末尾找到当前记录的行结束符。