rowkey之字典序

rowkey是不可分割的字節(jié)數(shù),按字典順序由低到高存儲在表中。一個空的數(shù)組用來標(biāo)示表空間的起始或結(jié)尾。
大家需要對ascii碼表有個清晰地認(rèn)識。比如說為什么“19”的字典順序是在“2”的前面呢。因為在hbase中rowkey是按照每一個字節(jié)的順序比較的,先比較第一個字節(jié),如果第一個字節(jié)小就不比較后面的,如果第一個字節(jié)相同比較第二個字節(jié)的大小,以此類推。所以“19”是兩個字節(jié),第一個字節(jié)的ascii碼是49,比“2”的ascii的50小,所以字符串的19字典順序比字符串小。

創(chuàng)建以19,2為start key 與end key的hbase表

 Configuration conf = HBaseConfiguration.create();
 conf.set("hbase.zookeeper.quorum", "m1,m2,m3");
 conf.set("hbase.zookeeper.property.clientPort", "2181");
 Connection connection = ConnectionFactory.createConnection(conf);
 Admin admin = connection.getAdmin();
 HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(namespaceAsString + ":" + tableName));
 desc.addFamily(new HColumnDescriptor(familyName));
 String startKeyString="19";
 String endKeyString="2";
 byte[] startKey=startKeyString.getBytes();
 byte[] endKey=endKeyString.getBytes();
 byte[][] splitKeys = new byte[2][];
 System.out.println(splitKeys.length);
 splitKeys[0]=startKey;
 splitKeys[1]=endKey;
 admin.createTable(desc,splitKeys);

執(zhí)行代碼后,查看表的region分布為:


image.png

插入記錄到表中的代碼

 Table table = connection.getTable(TableName.valueOf(namespaceAsString, tableName));
 byte[] rowKey=Bytes.toBytes("3");
 Put put = new Put(rowKey);
 put.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(columnName),  rowKey);
 table.put(put);

運行程序后,發(fā)現(xiàn)請求數(shù)變化,記錄寫入到start key為2的分區(qū),而不是第一個region分區(qū)(start key為空,end key為19),因為記錄存儲在哪個region上,是根據(jù)記錄的rowkey與分區(qū)的key進行按字節(jié)比較,決定最終存儲位置。
“3“與”19“的第一個字符”1“比較,比”1“大,繼續(xù)向接下來的key比較,”3“與”2“字符比較,比“2”大,所以存儲在start key為“2”的region。


image.png

即使我們在創(chuàng)建分區(qū)指定的分區(qū)byte[]是亂序的,創(chuàng)建好表后table頁面展示的region也是按照rowkey的字典序排列。

byte[][] splitKeys = new byte[4][];
System.out.println(splitKeys.length);
splitKeys[0]="a".getBytes();
splitKeys[1]="2".getBytes();
splitKeys[2]="19".getBytes();
splitKeys[3]="100".getBytes();
admin.createTable(desc,splitKeys);

創(chuàng)建好表后,各個region的信息,看到100排在了,19的前面,因為當(dāng)rowkey比較完第一個字符后,會比較第二個字符,發(fā)現(xiàn)“0”小于“9”,所以"100"放在了"19"的前面。


image.png

ASCII Table參考

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容