HBase2.1.0分页查询(支持跳页)
HBase分页
hbase中的数据是按照rowkey字典排序存储的,实现分页的思路有两个,一个是获取页面的起始rowkey,然后使用PageFilter来限制每页的数量。
另一种是获取页面的起始rowkey和结束rowkey,然后直接调用scan的withStartRow和withStopRow查询即可。
方案一、PageFilter
hbase中有自带的PageFilter,能够实现分页功能,但是局限性很大,实际很少使用。
就是说,PageFilter的作用域是单个的region,会从每个region中返回符合条件的数据,如果某个表有多个region,那么返回的数量就不准确了。因此,使用PageFilter的前提条件是必须只有一个region(这对于hbase来说显然不合适)。
public static ResultScanner queryDataByPage(String tableName, int currentPage, int pageSize) {Table table;byte[] startRow;ResultScanner resultScanner = null;try {table = connection.getTable(TableName.valueOf(tableName));int from = (currentPage - 1) * pageSize;startRow = getStartRow(table,from);Scan scan = new Scan();PageFilter pageFilter = new PageFilter(pageSize);scan.setFilter(pageFilter);if (startRow != null){scan.withStartRow(startRow,false);}resultScanner = table.getScanner(scan);} catch (IOException e) {logger.error(e.getMessage());}return resultScanner;}private static byte[] getStartRow(Table table,int from){byte[] startRow = null;Scan scan = new Scan();PageFilter pageFilter = new PageFilter(from);scan.setFilter(pageFilter);ResultScanner scanner = null;try {scanner = table.getScanner(scan);} catch (IOException e) {logger.error(e.getMessage());}Iterator<Result> iterator = scanner.iterator();Result result = null;while (iterator.hasNext()){result = iterator.next();}if (result != null){startRow = result.getRow();}return startRow;}
方案二、Limit
从2.0开始,HBase提供了一个limit功能来从RegionServer层面限制返回的数量。
public static ResultScanner queryDataByPage(String tableName, int currentPage, int pageSize) {Table table;byte[] startRow;byte[] stopRow;ResultScanner resultScanner = null;try {table = connection.getTable(TableName.valueOf(tableName));int from = (currentPage - 1) * pageSize;startRow = getStartRow(table,from);int to = currentPage * pageSize;stopRow = getStopRow(table,to);Scan scan = new Scan();if (startRow != null){scan.withStartRow(startRow,false);}if (stopRow != null){scan.withStopRow(stopRow,true);}resultScanner = table.getScanner(scan);} catch (IOException e) {logger.error(e.getMessage());}return resultScanner;}private static byte[] getStartRow(Table table,int from){byte[] startRow = null;Scan scan = new Scan();scan.setLimit(from);ResultScanner scanner = null;try {scanner = table.getScanner(scan);} catch (IOException e) {logger.error(e.getMessage());}Iterator<Result> iterator = scanner.iterator();Result result = null;while (iterator.hasNext()){result = iterator.next();}if (result != null){startRow = result.getRow();}return startRow;}private static byte[] getStopRow(Table table,int to){byte[] stopRow = null;Scan scan = new Scan();scan.setLimit(to);ResultScanner scanner = null;try {scanner = table.getScanner(scan);} catch (IOException e) {logger.error(e.getMessage());}Iterator<Result> iterator = scanner.iterator();Result result = null;while (iterator.hasNext()){result = iterator.next();}if (result != null){stopRow = result.getRow();}return stopRow;}
其实方案二这种方式主要是利用setLimit获取页面的起止rowkey,和方案一的区别就是解决了PageFilter的单region局限。
当然方案二也非常笨,需要先通过两次扫描表来获取起止rowkey,第三次才是取所需的页面数据。目前不知道其他的方案,先用这种。
HBase2.1.0分页查询(支持跳页)相关推荐
- springboot:实现分页查询,以及翻页功能
在pom.xml中引入依赖 <!-- 分页查询插件 --><dependency><groupId>com.github.pagehelper</groupI ...
- iText5使用绝对定位制作pdf打印针式发票,支持跳页
1.定义纸张大小,通过对比A4的大小计算相应发票大小的值 A4纸的大小为210mm×297mm,对应的Rectangle为new Rectangle(595,842) 2.加载中文字体,中文字体采用的 ...
- php倒序分页重复,时间倒序分页查询,翻页中有新增的数据插入db,导致返回重复数据,这个有什么好的解决办法没?谢谢大家...
不好意思竟然是世界上最好的语言. 而我回答是基于nodejs的. 不过不影响,理解思路就好. -------原答案------ 我在看coding.net的api的时候发现他有两种more的方式. 语 ...
- ElasticSearch分页查询的3个坑
点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 每天 14:00 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java ...
- 数据库水平分库分表后的数据分页查询解决方案
2021-09-04 更: 推荐下自己的个人框架,后面代码都会移植到框架中 链接 2020-10-19 更: 月底不出意外,打算重构了,fabric区块链框架改的差不多了 2020-10-? 更: 谢 ...
- ElasticSearch 分页查询及深度分页原理与实现
查询流程 查询阶段 在初始化查询阶段(query phase),查询被向索引中的每个分片副本(原本或副本)广播.每个分片在本地执行搜索并且建 立了匹配 document 的优先队列(priority ...
- Oracle、 Mysql 、 SQLserver 分页查询
MYSQL 分页最简单了. SELECT * FROM Account WHERE (usertype='base' or usertype='home' or usertype='salse') ...
- python分页查询_分页查询
分页 使用SELECT查询时,如果结果集数据量很大,比如几万行数据,放在一个页面显示的话数据量太大,不如分页显示,每次显示100条. 要实现分页功能,实际上就是从结果集中显示第1~100条记录作为第1 ...
- jdbc结合sqlserver的javaWeb工程的分页查询共通操作代码
搜索这个标题找到一篇文章: 适用所有使用jdbc结合sqlserver的javaWeb工程的分页查询共通操作代码 http://alexlsg.iteye.com/blog/700015 看了之后,试 ...
最新文章
- AI一分钟 | 蔚来赴美IPO,开盘跌破发行价;TensorFlow开源新库TFDV
- 最新、最全面的LAMP+wordpress安装过程!!
- android proguard 第三方jar,Android Studio代码混淆-第三方jar混淆汇总(持续更新)
- 一次哔哩哔哩面试经历,真香!
- arduino i2c 如何写16位寄存器_Arduino之我见
- oracle导出BOM文件,ORACLE ERP导数据(BOM清单)-备份恢复-Oracle频道-中国IT实验室
- IDEA的使用注释编程时,出现报错解决方案
- for语句 2017-03-17
- SpringMVC自学日志04(Controller 及 RestFul风格 )
- leetcode题解62-不同路径
- iOS tableView刷新
- 面试者为何从来得不到反馈?
- Sql Function defference returns and returns
- wait会释放锁吗_漫画:如何证明sleep不释放锁,而wait释放锁?
- python 模块定义_在python中定义私有模块函数
- Lab4: traps
- vue显示PDF文件
- 交换机的工作原理及配置
- 外贸业务员该如何拓客?
- Art-Template模板语法