HBase的rowkey是一串二进制数据,在Java中就是一个byte[],是一行数据的唯一标识符。
而业务的主键可能是有各种数据类型的,所以,这里要解决2个问题:
将各种实际使用的数据类型与byte[]进行相互转换
保序:byte[]形式的rowkey的排序结果与原始数据的排序结果一致
rowkey的比较就是byte[]的比较,按字典序进行比较(二进制排序),简单说,就是c语言中memcmp函数。通过下面的示例,我们通过排序结果来对这一比较规则以及数据类型转换进行理解。
(1)ascii码的大小比较
1234 -> 0x31 32 33 34
5 -> 0x35
从ascii码表示的数字来看,1234 > 5, 但从字典序来看,1234 < 5
(2)具有相同前缀的ascii码比较
1234 -> 0x31 32 33 34
12340 -> 0x31 32 33 34 00
在C语言中,字符串一般是以0自己结尾的。本例的两个字符串虽然前缀相同,但第二个末尾多了0字节,则第二个“较大”。
(3)正数与负数的比较
int类型的100 -> 0x00 00 00 64
int类型的-100 -> 0xFF FF FF 9C
100 > -100,但其二进制表达中,100 < -100
我们可以将这个比较规则总结如下:
从左到右逐个字节进行比较,以第一个不同字节的比较结果作为两个byte[]的比较结果
字节的比较是按无符号数方式进行的
“不存在”比“存在”小
常见的rowkey编码问题:
有符号数:二进制表示中,有符号数的首bit是1,在字典序规则下,负数比正数大,所以,当rowkey的值域同时包含正数和负数时,需要对符号位进行反转,以确保正数比负数大
倒序:通常用long来描述时间,一般都是倒排的,假设原始值是v,则v的倒序编码是Long#MAX_VALUE - v。
https://blog.csdn.net/weixin_34206899/article/details/89651066