我设计的rowkey是这种形式的: 商品ID#日期#机构ID#采购单号(#为字段间的分隔,方便范围查询),商品ID是一串long型的数值,具有连续性。为了充分发挥分布式的优点,需要将这些记录离散地存储在hbase集群的各节点上。此时我就将商品ID反转后再存储——Bytes.toBytes(Long.reverse(商品ID),以达到离散存储的目的。然后将这些字段分别转换成byte数组再通过Bytes.add()组装好当成rowkey。就这样我可以高效地根据rowkey去查询记录了,范围查询时只需要把startRow中的查询条件以#结尾,而stopRow的查询条件以$结尾。原因很简单#的ASCII码是35,$的ASCII码是36。
输出结果为:
35,-113,80,0,0,0,0,0,
35,
若商品ID是717252时,在我读取rowkey并split获取字段时就会出错。正常情况我split应该得到3个字段,而这种特殊情况我就会split得到4个字段。根本原因就是商品ID在反转后转换成byte时生成了与#号相同的字节码!!于是我陷入了沉思,如何规避这样的危险呢。其实很简单,数位数呗~
第一篇很水的个人技术博客,就这样ending吧~~