HBase伪快速分页查询

简介:     之前有两个功能,都是查询历史数据的一个分页查询,系统刚上线的时候,没有太多的数据,就一直扔在mysql里面,后来里面数据上亿之后,就查不到了,而且数据还在以指数级增长方式上报,后来,这部分业务单独迁移到hbase集群去存放,之前页面的查询也改查hbase了。


    之前有两个功能,都是查询历史数据的一个分页查询,系统刚上线的时候,没有太多的数据,就一直扔在mysql里面,后来里面数据上亿之后,就查不到了,而且数据还在以指数级增长方式上报,后来,这部分业务单独迁移到hbase集群去存放,之前页面的查询也改查hbase了。但是hbase对分页查询这种东西支持不好,如果按照以往查询mysql的思路,查询出一个总的count,再查询出这一页的数据,这种方式去查询hbase,那么如果你仔细去跟代码计算时间的话,你会发现hbase去查count,无论哪种方式,都会引起全表扫描,是非常慢的。整个页面加载出来,看了下响应事件,大概要45s,等的我都喝了两杯茶了。


   so,我想了个比较伪的分页查询方法,去掉查询count操作,值查询一页数据:


 

public Page<BatteryData> findBatterHisData(BatteryHisDto dto)throws Exception {
        Page<BatteryData> dataPage=new Page<BatteryData>();
        List<BatteryData> dataList=new ArrayList<>();
        int totalSize=0;
        Table table=runner.getTable(tableName);
        Scan dataScan=new Scan();
        ResultScanner dataScanner=null;
        List<Filter> dataFilters = new ArrayList<Filter>();
        if(StringUtils.isNotBlank(dto.getBatteryNo())){//电池组编号过滤
            Filter filter=new RowFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator(dto.getBatteryNo()+"_"));
            dataFilters.add(filter);
        }
        Filter pageFilter=new PageFilter(dto.getPage()+dto.getPageSize());
        dataFilters.add(pageFilter);
        FilterList dataFilterList = new FilterList(FilterList.Operator.MUST_PASS_ALL, dataFilters);
        dataScan.setFilter(dataFilterList);
        dataScanner=table.getScanner(dataScan);
        dataList= rsh.handle(tableName,dataScanner);
        if(dataList==null || dataList.size()<1){
            dataPage.setTotalCount(0);
            dataPage.setResult(null);
            return dataPage;
        }
        int startNo = dto.getPage();
        int endNo=startNo+dto.getPageSize();
        dataPage.setTotalCount(dto.getPage()+dto.getPageSize()+1);
        dataPage.setResult(dataList.subList(startNo,endNo));
        table.close();
        return dataPage;
	}




     因为用户关注的,通常是前几页的数据,所有我每次查询的时候,返回总页数,都返回个随便的数(跟前端的分页表格配合,实际上,我的前端只提供了上下分页,哈哈),然后查询有限条的数据,通常hbase表都是上亿甚至是百亿的,所以,用户时不太可能通过只点击上一页下一页,这样点到我最后一页的,可以放心了。最多他点个几千页,也就手疼到不行了。这样下来,响应速度控制在800ms内,无压力。


    PS,看到很多网友通过rowkey去做分页,具体思路是,每次记录下起始的rowkey和结束的rowkey,然后根据rowkey搜索,这样也是很快的,个人认为,也ok。



   

相关实践学习
云数据库HBase版使用教程
&nbsp; 相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情:&nbsp;https://cn.aliyun.com/product/hbase &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
5月前
|
缓存 分布式数据库 API
hbase查询速度很慢
hbase查询速度很慢
230 1
|
分布式计算 分布式数据库 Scala
Spark查询Hbase小案例
写作目的 1)正好有些Spark连接HBase的需求,当个笔记本,到时候自己在写的时候,可以看 2)根据rowkey查询其实我还是查询了好久才找到,所以整理了一下 3)好久没发博客了,水一篇
179 0
Spark查询Hbase小案例
|
SQL 缓存 分布式计算
HBase查询一张表的数据条数的方法
HBase查询一张表的数据条数的方法
802 0
HBase查询一张表的数据条数的方法
|
存储 大数据 Java
HBase 表设计_5 | 学习笔记
快速学习 HBase 表设计_5
97 0
|
分布式数据库 开发者 Hbase
HBase表设计_1 | 学习笔记
快速学习 HBase表设计_1
101 0
|
分布式数据库 开发者 Hbase
HBase表设计_2 | 学习笔记
快速学习 HBase表设计_2
104 0
|
分布式数据库 开发者 Hbase
HBase 表设计_3 | 学习笔记
快速学习 HBase 表设计_3
106 0
|
存储 分布式数据库 开发者
HBase表设计_8 | 学习笔记
快速学习 HBase表设计_8
117 0
|
分布式数据库 开发者 Hbase
HBase 表设计_4 | 学习笔记
快速学习 HBase 表设计_4
103 0
|
存储 分布式数据库 开发者
HBase 表设计_7 | 学习笔记
快速学习 HBase 表设计_7
104 0