hbase的rowkey设计之字典顺序

大家都知道hbase在存储rowkey的时候是按照字节的字典顺序来排序和存储的。但这个字典序是什么其实说起来简单,理解起来可能有些同学不是十分清楚,今天我就来描述下这个问题。

首先,大家需要对ascii码表有个清晰地认识。比如说为什么“19”的字典顺序是在“2”的前面呢。因为在hbase中rowkey是按照每一个字节的顺序比较的,先比较第一个字节,如果第一个字节小就不比较后面的了,如果第一个字节相同比较第二个字节的大小,以此类推。所以“19”是两个字节,第一个字节的ascii码是49,比“2”的ascii的50小,所以字符串的19字典顺序比字符串小。

上面比较了字符串的顺序, 下面说下数字的字符串顺序。在数据类型为int的值中,19的byte数组的值肯定是比数字2的大的。

在hbase开发中,可以设定第一个字节数组的分区,然后使用Bytes.copy(a,b).a是第一个字节数组,后面可以拼很多字节数组,因为region是按照a字节分区的,所以数据入库后会按照先按照a字节做字典序排序,以此类推,后面的字节以此排序。这样可以避免数据热点问题。

还有一点要注意的,逻辑上连贯的数据在入库时最好物理存储上也一致,这样可以快速扫描出结果返回给客户端。比如我想查找某个用户的记录,可以按照用户ID来查找,关于这个用户的行为都是连续的存储在一起的,无论是物理还是逻辑。

你可能感兴趣的:(hbase)