了解Hadoop Text byteoffset

时间:2015-12-06 06:21:19

标签: hadoop

我运行了以下程序。

Text t = new Text("\u0041\u00DF\u6771\uD801\uDC00");
        System.out.println(t.getLength());
        System.out.println(t.find("\u0041"));
        System.out.println(t.find("\u00DF"));
        System.out.println(t.find("\u6771"));
        System.out.println(t.find("\uD801"));
        System.out.println(t.find("\uD801\uDC00"));

Output

10
0
1
3
-1
6

从我的理解中,find返回Text中的byteoffset。

  

0041 - > 01000001,00DF - > 11011111,6771 - > 0110011101110001

我无法理解输出。 也是为什么

  

t.find( “\ uD801”)

是-1?

1 个答案:

答案 0 :(得分:1)

此示例已在 HADOOP The Definitive Guide 一书中进行了解释。

Text类使用UTF8编码存储数据。由于它使用UTF8编码,因此Text内的索引基于UTF8编码字符的字节偏移量(与Java字符串不同,其中字节偏移量在每个字符处)。

您可以看到这个答案,以了解Hadoop中Text和String之间的区别: Difference between Text and String in Hadoop

文字:“\ u0041 \ u00DF \ u6701 \ uD801 \ uDC00”,解释如下:

  • \ u0041 ==>它的拉丁字母“A”。其UTF-8代码单元: 41(1字节)
  • \ u00DF ==>它的拉丁字母“Sharp S”。其UTF-8代码单元: c3 9f(2字节)
  • \ u6771 ==>统一的汉字表意文字(中文)。其UTF-8代码单元: e6 9d b1(3字节)
  • \ uD801 \ uDC00 ==> Deseret letter(https://en.wikipedia.org/wiki/Deseret_alphabet)。其UTF-8代码单元: f0 90 90 80(4字节)

以下是字节偏移量,当它存储在Text(UTF-8编码)时:

  • 偏移“\ u0041”==> 0
  • “\ u00DF”的偏移量==> 1(由于前一个UTF-8字符占用1个字节:字符41
  • 偏移“\ u6771”==> 3(因为之前的UTF-8字符占用了2个字节:字符c3 9f
  • “\ uD801 \ uDC00”的偏移量==> 6(因为之前的UTF-8字符占用了3个字节:字符e6 9d b1

最后,最后一个UTF-8字符(DESERET CAPITAL LETTER LONG I)占用4个字节(f0 90 90 80)。

因此总长度为:1 + 2 + 3 + 4 = 10.

当你t.find("\uD801")时,你得到-1。因为,根据UTF-8编码,字符串中不存在此类字符。

“\ uD801 \ uDC00”被视为单个字符(DESERET CAPITAL LETTER LONG I)。因此,当您查询“\ uD801 \ uDC00”的偏移量时,您会得到6的正确答案。