21

Hadoop框架org.apache.hadoop.io.Text和里面有什么区别?java.lang.String

为什么他们不能使用String而不是引入一个新Text类?

我调查了差异,发现它与编码格式有关;但是我还不明白。

有人可以解释差异(如果适用,请举例说明)?

4

1 回答 1

20

Text 对象的二进制表示是一个可变长度整数,其中包含字符串的 UTF-8 表示中的字节数,然后是 UTF-8 字节本身。

Text 是 UTF8 类的替代品,该类已被弃用,因为它不支持编码超过 32,767 字节的字符串,并且因为它使用 Java 修改后的 UTF-8。

此外,Text 使用标准 UTF-8,这可能更容易与其他理解 UTF-8 的工具进行交互操作。

以下是与 String 功能相关的一些简要差异:

索引: 由于它强调使用标准 UTF-8,因此 Text 和 Java String 类之间存在一些差异。Text 类的索引是根据编码字节序列中的位置,而不是字符串中的 Unicode 字符或 Java char 代码单元(因为它是 String)。

例如,charAt()返回一个表示 Unicode 代码点的 int,这与返回 char 的 String 变体不同。

迭代: 迭代文本中的 Unicode 字符由于使用字节偏移进行索引而变得复杂,因为您不能只增加索引。

可变: 与 String 的另一个区别是 Text 是可变的(就像 Hadoop 中的所有 Writable 实现一样,除了 NullWritable,它是一个单例)。您可以通过调用其中一个 set() 方法来重用 Text 实例。

诉诸字符串:

Text 没有像 处理字符串那样丰富的 API java.lang.String,因此在很多情况下,您需要将 Text 对象转换为 String。这是以通常的方式完成的,使用以下toString()方法:

有关更多详细信息,请阅读权威指南。

于 2013-11-08T06:01:01.077 回答