rowkey之字典序

本文介绍rowkey在hbase表中的排序规则,并运行示范代码进行验证

需要理解的概念&知识

  • rowkey是不可分割的字节数,按字典顺序由低到高存储在表中。
  • 空数组用来标识hbase表空间的起始或结尾。
  • ascii码表

示范样例展示

为什么“19”的字典顺序是在“2”的前面?

因为在hbase中rowkey是按照每一个字节的顺序比较的。

先比较第一个字节,如果第一个字节小就不比较后面的。如果第一个字节相同比较第二个字节的大小,以此类推。

所以“19”是两个字节,第一个字节的ascii码是49,比“2”的ascii的50小,所以字符串的19字典顺序比字符串小。

代码实践:

创建以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);

执行代码后,查看表的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);

运行程序

执行代码后,发现请求数Requests列变化,记录写入到start key为2的分区,而不是第一个region分区(start key为空,end key为19)。

因为记录存储在哪个region上,是根据记录的rowkey与分区的key进行按字节比较,决定最终存储位置。

“3“与”19“的第一个字符”1“比较,比”1“大,继续向接下来的key比较,”3“与”2“字符比较,比“2”大,所以存储在start key为“2”的region。

图片

ASCII Table参考

图片

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值