HBase的rowkey是一串二進(jìn)制數(shù)據(jù)丐谋,在Java中就是一個(gè)byte[],是一行數(shù)據(jù)的唯一標(biāo)識(shí)符。
而業(yè)務(wù)的主鍵可能是有各種數(shù)據(jù)類型的膀跌,所以,這里要解決2個(gè)問(wèn)題:
將各種實(shí)際使用的數(shù)據(jù)類型與byte[]進(jìn)行相互轉(zhuǎn)換
保序:byte[]形式的rowkey的排序結(jié)果與原始數(shù)據(jù)的排序結(jié)果一致
rowkey的比較就是byte[]的比較固灵,按字典序進(jìn)行比較(二進(jìn)制排序)捅伤,簡(jiǎn)單說(shuō),就是c語(yǔ)言中memcmp函數(shù)巫玻。通過(guò)下面的示例丛忆,我們通過(guò)排序結(jié)果來(lái)對(duì)這一比較規(guī)則以及數(shù)據(jù)類型轉(zhuǎn)換進(jìn)行理解。
(1)ascii碼的大小比較
1234 -> 0x31 32 33 34
5 -> 0x35
從ascii碼表示的數(shù)字來(lái)看仍秤,1234 > 5熄诡, 但從字典序來(lái)看,1234 < 5
(2)具有相同前綴的ascii碼比較
1234 -> 0x31 32 33 34
12340 -> 0x31 32 33 34 00
在C語(yǔ)言中徒扶,字符串一般是以0自己結(jié)尾的粮彤。本例的兩個(gè)字符串雖然前綴相同,但第二個(gè)末尾多了0字節(jié),則第二個(gè)“較大”导坟。
(3)正數(shù)與負(fù)數(shù)的比較
int類型的100 -> 0x00 00 00 64
int類型的-100 -> 0xFF FF FF 9C
100 > -100屿良,但其二進(jìn)制表達(dá)中,100 < -100
我們可以將這個(gè)比較規(guī)則總結(jié)如下:
從左到右逐個(gè)字節(jié)進(jìn)行比較惫周,以第一個(gè)不同字節(jié)的比較結(jié)果作為兩個(gè)byte[]的比較結(jié)果
字節(jié)的比較是按無(wú)符號(hào)數(shù)方式進(jìn)行的
“不存在”比“存在”小
常見的rowkey編碼問(wèn)題:
有符號(hào)數(shù):二進(jìn)制表示中尘惧,有符號(hào)數(shù)的首bit是1,在字典序規(guī)則下递递,負(fù)數(shù)比正數(shù)大喷橙,所以,當(dāng)rowkey的值域同時(shí)包含正數(shù)和負(fù)數(shù)時(shí)登舞,需要對(duì)符號(hào)位進(jìn)行反轉(zhuǎn)贰逾,以確保正數(shù)比負(fù)數(shù)大
倒序:通常用long來(lái)描述時(shí)間,一般都是倒排的菠秒,假設(shè)原始值是v疙剑,則v的倒序編碼是Long#MAX_VALUE - v。
https://blog.csdn.net/weixin_34206899/article/details/89651066