hbase时间范围分页查询优化实践

生产情况

生产情况介绍

汽车故障码明细数据量大(PB级),明细数据存储在hbase中,早期产品的需求主要是根据tuid查询某天某车某控制器的故障情况,所以rowkey的设计规则是:tuid+日期+控制器+故障码编号+时间戳,这样,相安无事。现在需求是,查指定TUID的某段时间的明细数据,时间跨度不超过7天,查询条件时间精确到秒,接口返回时间不超过1秒。

方案设计

初始方案是,由于无法保障数据在同一个resion中,所以不能用Hbase原生的PageFilter进行过滤scan,考虑构建FilterList, 采用startRow和endRow方式过滤,scan出起始时间当天到截止时间当天的所有的数据,再进行过滤即可,但是该方案有个非常耗时的操作,不是扫描,是扫描后数据的提取

scan.setFilter(filterList);
List<byte[]> list = new ArrayList<>();
ResultScanner scanner = tableInterface.getScanner(scan);
for (Result r : scanner) {
                list.add(r.getRow());
}

优化方案

抛弃新建Arrraylist对象然后数据搬运的耗时操作,采用流的方式原地对scanner进行转换list操作,并进行过滤出需要的时间段的数据


final List<Result> filteredList = StreamSupport.stream(
                        resultScanner.spliterator(), Boolean.FALSE)
                        .filter(a -> a.listCells().get(0).getTimestamp() >=beginTimeL && a.listCells().get(0).getTimestamp()<= endTimeL)
                        .collect(Collectors.toList());

再根据分页请求,封装pageResponse的分页信息,根据startpage和pagesize找到对应的数据,对pageResponse进行setList,返回给前端,即可,接口响应时间少于1秒。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
HBase是一种分布式的NoSQL数据库,它并不支持传统的SQL语句,但它提供了Scan类来进行数据的扫描和检索。在HBase中实现分页查询需要结合Scan类和分页参数来完成。 以下是在HBase中进行分页查询的步骤: 1. 创建Scan对象,设置起始行和结束行。 2. 设置分页参数,包括每页数据条数和当前页码。 3. 遍历Scan对象获取结果集,并计算偏移量和限制条数。 4. 对结果集进行分页处理,返回分页数据。 下面是一个示例代码,实现了在HBase中进行分页查询的功能: ```java // 创建Scan对象 Scan scan = new Scan(); scan.setStartRow(Bytes.toBytes(startRow)); scan.setStopRow(Bytes.toBytes(stopRow)); // 设置分页参数 int pageSize = 10; int pageNum = 1; // 计算偏移量和限制条数 int offset = (pageNum - 1) * pageSize; int limit = pageSize; // 遍历Scan对象获取结果集 ResultScanner scanner = table.getScanner(scan); Result[] results = scanner.next(limit + offset); // 对结果集进行分页处理 List<Map<String, Object>> pageData = new ArrayList<>(); for (int i = offset; i < results.length && i < offset + limit; i++) { Result result = results[i]; Map<String, Object> rowData = new HashMap<>(); for (Cell cell : result.rawCells()) { rowData.put(Bytes.toString(CellUtil.cloneQualifier(cell)), Bytes.toString(CellUtil.cloneValue(cell))); } pageData.add(rowData); } ``` 在上面的示例代码中,我们使用了HBase的Scan类来进行数据的扫描和检索,并结合分页参数和偏移量来完成分页查询的功能。注意,这里的分页查询是基于行级别的,而非基于列级别的。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值