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分布為:

插入記錄到表中的代碼
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。

即使我們在創(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"的前面。

ASCII Table參考
