4

我有一个 100 TB 的文本文件,它有多行记录。而且我们没有给出每条记录占用多少行。一个记录的大小可以是 5 行,另一个可能是 6 行,另一个可能是 4 行。它不确定每条记录的行大小可能会有所不同。

所以我不能使用默认的 TextInputFormat,我已经编写了自己的输入格式和自定义记录阅读器,但我的困惑是:当拆分发生时,我不确定每个拆分是否包含完整记录。记录的某些部分可以进入第 1 部分,而另一些部分可以进入第 2 部分。但这是错误的。

那么,您能否建议如何处理这种情况,以便我保证我的完整记录在单个 InputSplit 中?

提前致谢-JE

4

2 回答 2

3

您需要知道记录是否实际上由某些已知的字符序列分隔。

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

如果记录不是字符分隔的,您将需要一些额外的逻辑,例如,计算已知数量的字段(如果有已知数量的字段)并将其显示为记录。这通常会使事情变得更复杂,容易出错并且速度很慢,因为还有大量的文本处理正在进行。

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

于 2013-05-21T06:20:37.063 回答
1

在您的记录阅读器中,您需要定义一个算法,您可以通过该算法:

  • 确定您是否在记录中间
  • 如何扫描该记录并读取下一条完整记录

这类似于 TextInputFormat LineReader 已经执行的操作 - 当输入拆分具有偏移量时,行记录读取器从该偏移量向前扫描它找到的第一个换行符,然后读取该换行符之后的下一条记录作为它将发出的第一条记录. 与此相关,如果块长度低于 EOF,行记录读取器将向上并超过块的末尾以查找当前记录的行终止字符。

于 2013-05-21T10:28:14.590 回答