Hadoop框架中org.apache.hadoop.io.Text
和java.lang.String
之间有什么区别?
为什么他们不能使用String
而不是引入新的Text
类?
我调查了差异,发现它与编码格式有关;但是我还不明白。
有人可以解释这些差异(例如,如果适用)?
答案 0 :(得分: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的字符串变体。
<强>迭代:强> 通过使用byte,迭代Text中的Unicode字符变得复杂 索引的偏移,因为你不能只增加索引。
<强>可变的:强> 与String的另一个区别是Text是可变的(就像Hadoop中的所有可写实现一样,除了NullWritable,它是一个单例)。你可以重用一个 通过调用其中一个set()方法来实现文本实例。
求助于字符串:
Text没有像操作字符串那样丰富的API
java.lang.String
,因此在许多情况下,您需要将Text对象转换为String。
这是通过常规方式使用toString()
方法完成的:
有关详细信息,请参阅权威指南。