Hbase分页查询的实战方案

  • hbase的rowkey是字典排序(如果不明白字典排序,可以百度搜索一下),所以利用这一个特性,是后插入进去的数据的rowkey在按字典排序是排在先插入的数据之前,这样查询出来的数据就是按照创建时间的顺序排列好的。
  • hbase提供了很多filter,可以利用pagingFilter,同时利用scan.setStartKey()来设置第一条数据的rowKey.
  • 按字段查询可以添加过滤器链,使用singleColumnValueFilter,添加多个,可以保证按字段查询。

综上所述,分页的关键是rowkey的设计,网上对此已有大篇详述,博主在实践中使用的是时间戳倒序加上long.MAX_VALUE作为使用次数,应用这种方案需要维护一张rowkey表,(如不想维护可以之间时间戳倒序加上一个唯一的字符串),rowkey表主要是包括表对象code(对应表的首字符大拼),当前时间currentDate,使用次数(次数默认取Long.MAX_VALUE)times。

具体到一个rowKey的取值为时间戳倒序+使用次数(Long.MAX_VALUE-System.currentTimeMillis + times),这样可以保证后插入的数据在查询时永远是先查询出来的。

具体的分页查询有两种方案:

  1. 每次多查一条数据出来,作为lastRowKey,每次查询作为startKey使用。这样是尽量节约内存的方式,但是坏处是只能连续翻页,比如一到二,二到三,不能一到三,并且不能向前翻页,使用限制多。
  2. 带过来pageIndex和pageSize,但是这样需要在翻后面的页时需要多查出来一些数据,然后截取想要的数据。页数越靠后,效果越差。

其他的具体就要看业务需求了,比方业务需要对某几个字段进行查询,可以考虑根据字段来设计rowkey,通过一些方式直接计算出来startRow和endRow,这样的效率是最快的。

博主目前只想到了上面的一些方案,其他的如果有好的建议可以私信。

 

你可能感兴趣的:(工作及学习的一些总结)