我有一个100 TB的文本文件,它有多行记录。并且我们没有给出每条记录占用多少行。一个记录可以是5行,其他可以是6行,另一个可以是4行。它不确定每条记录的线条大小可能会有所不同。
所以我不能使用默认的TextInputFormat,我已经编写了自己的inputformat和自定义记录阅读器,但我的困惑是:当分裂发生时,我不确定每个分割是否包含完整记录。记录的某些部分可以分为1,另一部分分为2.但这是错误的。
那么,您能否建议如何处理这种情况,以便保证我的完整记录只能在一个InputSplit中进行?
提前致谢 -JE
答案 0 :(得分:3)
您需要知道记录是否实际上由某些已知的字符序列分隔。
如果您知道这一点,可以设置textinputformat.record.delimiter
config参数来分隔记录。
如果记录不是以字符分隔的,那么您将需要一些额外的逻辑,例如,计算已知数量的字段(如果有已知数量的字段)并将其作为记录显示。这通常会使事情变得更复杂,容易出错并且因为正在进行另外的大量文本处理而变得缓慢。
尝试确定记录是否分隔。也许发布几个记录的简短例子会有所帮助。
答案 1 :(得分:1)
在您的记录阅读器中,您需要定义一个算法,您可以通过该算法:
这类似于TextInputFormat LineReader已经执行的操作 - 当输入分割具有偏移量时,行记录阅读器从该偏移量向前扫描它找到的第一个换行符,然后在该换行符作为第一个记录后读取下一个记录它会发射。与此相关,如果块长度低于EOF,行记录阅读器将到达并超过块的末尾,以找到当前记录的行终止字符。