美文网首页
[HBase] - 理解 HBase Rowkey 字典排序

[HBase] - 理解 HBase Rowkey 字典排序

作者: 六层楼那么高 | 来源:发表于2022-04-22 18:23 被阅读0次

    我们都知道 HBase 的数据根据 rowkey 字典序排序的,理解这个概念很重要。

    先理解名词 - 「字典序」

    根据 wiki 解释:

    在英文字典中,排列单词的顺序是先按照第一个字母以升序排列(即a、b、c……z 的顺序);如果第一个字母一样,那么比较第二个、第三个乃至后面的字母。如果比到最后两个单词不一样长(比如,sigh 和 sight),那么把短者排在前。

    通俗的理解,字典序是把字符左对齐,从左到右比大小的排序,一旦比出大小就停止比较后续的字符。
    那么排序规则是什么?如果只考虑字母的话,就是: a < b < c < ... < z,当然这个规则也是人为约定的,举例以下就是字典序:

    a
    ab
    abc
    b

    理解 HBase Rowkey 的字典序

    有了之前的概念,理解 HBase Rowkey 字典序会容易一点:

    1. rowkey 字符串左对齐,从左到右比大小,比到就停止
    2. 怎么比大小:基于字符的 ASCII 码大小 ,例如ASCII 中 A < a,a < b , 1 < 2, 1 < a 具体可以参考 wiki。

    下面这里从实现层面举个例子:假如 HBase 要比较 rowkey "19" 和 "2" ,怎么做?

    1. 将 rowkey 转为字节数组, “19” => [49,57] ,"2" => [50]
    2. 从两个字节数组下标 0 开始往后比大小
    3. 第一个字节 50 比 49 大,所以排序是 2 > 19
    byte[] a = "19".getBytes()
    // =>  [49,57] 
    byte[] b = "2".getBytes()
    // =>  [50] 
    

    这里值得一提的是:ASCII 可见字符都是单字节表示,所以字符与 ASCII 字节数组是一一对应的。
    但如果你用非 ASCII 可见字符做 rowkey ,例如汉字,就会出现不可控因素,因为一个汉字对应的是多个字节。所以建议 rowkey 就采用常见的可见字符,避免用特殊字符。

    ASCII 码可显示字符有 95 个,大致顺序如下

    ! “ #$... 0123..9..ABC..Z...abc...z..~

    第一个是:「空格」,最后一个是:「~」

    下一篇将讲讲 rowkey 的设计与优化,包括预分区的选择策略。

    wiki https://zh.wikipedia.org/wiki/ASCII

    相关文章

      网友评论

          本文标题:[HBase] - 理解 HBase Rowkey 字典排序

          本文链接:https://www.haomeiwen.com/subject/zrxwsrtx.html