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分页查询(支持跳页)相关推荐

  1. springboot:实现分页查询,以及翻页功能

    在pom.xml中引入依赖 <!-- 分页查询插件 --><dependency><groupId>com.github.pagehelper</groupI ...

  2. iText5使用绝对定位制作pdf打印针式发票,支持跳页

    1.定义纸张大小,通过对比A4的大小计算相应发票大小的值 A4纸的大小为210mm×297mm,对应的Rectangle为new Rectangle(595,842) 2.加载中文字体,中文字体采用的 ...

  3. php倒序分页重复,时间倒序分页查询,翻页中有新增的数据插入db,导致返回重复数据,这个有什么好的解决办法没?谢谢大家...

    不好意思竟然是世界上最好的语言. 而我回答是基于nodejs的. 不过不影响,理解思路就好. -------原答案------ 我在看coding.net的api的时候发现他有两种more的方式. 语 ...

  4. ElasticSearch分页查询的3个坑

    点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 每天 14:00 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java ...

  5. 数据库水平分库分表后的数据分页查询解决方案

    2021-09-04 更: 推荐下自己的个人框架,后面代码都会移植到框架中 链接 2020-10-19 更: 月底不出意外,打算重构了,fabric区块链框架改的差不多了 2020-10-? 更: 谢 ...

  6. ElasticSearch 分页查询及深度分页原理与实现

    查询流程 查询阶段 在初始化查询阶段(query phase),查询被向索引中的每个分片副本(原本或副本)广播.每个分片在本地执行搜索并且建 立了匹配 document 的优先队列(priority ...

  7. Oracle、 Mysql 、 SQLserver 分页查询

    MYSQL 分页最简单了. SELECT * FROM Account  WHERE (usertype='base' or usertype='home' or usertype='salse')  ...

  8. python分页查询_分页查询

    分页 使用SELECT查询时,如果结果集数据量很大,比如几万行数据,放在一个页面显示的话数据量太大,不如分页显示,每次显示100条. 要实现分页功能,实际上就是从结果集中显示第1~100条记录作为第1 ...

  9. jdbc结合sqlserver的javaWeb工程的分页查询共通操作代码

    搜索这个标题找到一篇文章: 适用所有使用jdbc结合sqlserver的javaWeb工程的分页查询共通操作代码 http://alexlsg.iteye.com/blog/700015 看了之后,试 ...

最新文章

  1. AI一分钟 | 蔚来赴美IPO,开盘跌破发行价;TensorFlow开源新库TFDV
  2. 最新、最全面的LAMP+wordpress安装过程!!
  3. android proguard 第三方jar,Android Studio代码混淆-第三方jar混淆汇总(持续更新)
  4. 一次哔哩哔哩面试经历,真香!
  5. arduino i2c 如何写16位寄存器_Arduino之我见
  6. oracle导出BOM文件,ORACLE ERP导数据(BOM清单)-备份恢复-Oracle频道-中国IT实验室
  7. IDEA的使用注释编程时,出现报错解决方案
  8. for语句 2017-03-17
  9. SpringMVC自学日志04(Controller 及 RestFul风格 )
  10. leetcode题解62-不同路径
  11. iOS tableView刷新
  12. 面试者为何从来得不到反馈?
  13. Sql Function defference returns and returns
  14. wait会释放锁吗_漫画:如何证明sleep不释放锁,而wait释放锁?
  15. python 模块定义_在python中定义私有模块函数
  16. Lab4: traps
  17. vue显示PDF文件
  18. 交换机的工作原理及配置
  19. 外贸业务员该如何拓客?
  20. Art-Template模板语法

热门文章

  1. Unity TextMeshPro图文混排
  2. Hadoop3 伪分布式安装
  3. 购物车页面实现 :Okhttp+mvp+RecyclerView
  4. python函数测验题_python函数相关练习题
  5. HTML新年快乐2023源代码,兔年新年红包代码
  6. 大胆猜测:今年816全民顾家日埋了3个伏笔?
  7. Maven 生命周期和插件详解
  8. java 获取父节点_Java根据子节点递归父节点
  9. Doker入门简介和安装
  10. Python中的List知识