在 hadoop mapreduce 中的 TextInputFormat 中,什么是字节偏移量?以及键如何作为字节偏移量和值如何作为行的内容?

Ash*_*ngh 2 hadoop

在浏览 CustomInputFormat 主题时,我开始知道我们有一些默认输入格式,如 TextInputFormat、KeyValueInputFormat、SequencefileInputFormat 和 NlineInputFormat。

对于 TextInputFormat,从记录中读取行,行的字节偏移量用作键,内容用作值。这个字节偏移是什么以及如何将行的内容视为值请提出建议。

Kis*_*ore 6

TextInputFormat是默认的 InputFormat 。每条记录都是一行输入。键,一个 LongWritable ,是该行开头的文件内的字节偏移量。该值是该行的内容,不包括任何行终止符(例如,换行符或回车符),并被打包为一个 Text 对象。所以一个包含以下文本的文件:

On the top of the Crumpetty Tree
The Quangle Wangle sat,
But his face you could not see,
On account of his Beaver Hat.
Run Code Online (Sandbox Code Playgroud)

分为四个记录的一个分割。记录解释如下

键值对:

(0, On the top of the Crumpetty Tree)
(33, The Quangle Wangle sat,)
(57, But his face you could not see,)
(89, On account of his Beaver Hat.)
Run Code Online (Sandbox Code Playgroud)

显然,键不是行号。这在一般情况下是不可能实现的,因为文件在字节而不是行边界处被分成多个部分。拆分是独立处理的。行号实际上是一个连续的概念。您必须在使用它们时保留行数,因此可以知道拆分中的行号,但不能在文件中

但是,每行文件内的偏移量由每个拆分独立于其他拆分知道,因为每个拆分都知道前面拆分的大小,并且只需将其添加到拆分内的偏移上以生成全局文件偏移。对于需要每行唯一标识符的应用程序,偏移量通常就足够了。结合文件名,它在文件系统中是唯一的。当然,如果所有的线都是固定的宽度,那么计算线数就是将偏移量除以宽度的简单问题。