HBase key设置加快查询速度小谈

最近做一个基于HBase 的大日志存储,分析系统。 在key的设置上有一些心得,拿出来大家共享。

    我们这个日志系统有个需求,就是根据某个操作找出整个会话的所有操作,按一般的做法就是根据SID(会话Id)字段来扫描全表,返回所有该会话SID的记录。代码如下:

               Scan scan = new Scan();

FilterList filterList = new FilterList();

filterList.addFilter(new SingleColumnValueFilter(Bytes.toBytes("CF"),

Bytes.toBytes("SID"), op, Bytes.toBytes("10000000")));

scan.setFilter(filterList);

ResultScanner rs = currentTable.getScanner(scan);


由于hbase 是key ,value存储系统,因此对基于V的条件查询都是全表扫描,对于小数据量没问题,但是一旦数据量大到百万,千万级(我们这里是一天就千万级)那就会无法接受,会非常非常非常慢。。 但是我们知道Key是是顺序排列的,基于key的访问就会非常快。因此我们在设计Key的时候加点小小技巧就可以让你轻松快速查找到相同SID的操作。

具体:KEY = DATETIME +SID+SEQ (SEQ为同一SID的不同操作的顺序编号)。 这样我们查找SID=100000的所有操作的代码如下:

                Scan scan = new Scan();

                String startkey = DATETIME + "100000"

                String endkey =  DATETIME +"100000"+"99999"  (我们假设每个session最多有100000个操作,当然实际上远远小于这个数值。)

scan.setStartRow(Bytes.toBytes(startKey));

scan.setStopRow(Bytes.toBytes(endKey));

       ResultScanner rs = currentTable.getScanner(scan);

 

经过上面一改,不论你的hbase记录多大,上述查询时间都在毫秒级了。。。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值