Hbase本身是没有分页查询的,我在网上找了很多资料来实现一个分页功能,在这里做了一下记录,分享给大家,有什么不足之处,请尽管指出。废话不多说,看代码。

import java.io.IOException;

import java.util.LinkedHashMap;

import java.util.LinkedList;

import java.util.List;

import java.util.Map;

import org.apache.commons.lang.StringUtils;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.hbase.HBaseConfiguration;

import org.apache.hadoop.hbase.client.Get;

import org.apache.hadoop.hbase.client.HTableInterface;

import org.apache.hadoop.hbase.client.HTablePool;

import org.apache.hadoop.hbase.client.Result;

import org.apache.hadoop.hbase.client.ResultScanner;

import org.apache.hadoop.hbase.client.Scan;

import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;

import org.apache.hadoop.hbase.filter.Filter;

import org.apache.hadoop.hbase.filter.FilterList;

import org.apache.hadoop.hbase.filter.FirstKeyOnlyFilter;

import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;

import org.apache.hadoop.hbase.util.Bytes;

publicclass HBaseUtils {

privatestatic Configuration config = null;

privatestatic HTablePool tp = null;

static {

// 加载集群配置

config = HBaseConfiguration.create();

config.set("hbase.zookeeper.quorum", "xx.xx.xx");

config.set("hbase.zookeeper.property.clientPort", "2181");

// 创建表池(可伟略提高查询性能,具体说明请百度或官方API)

tp = new HTablePool(config, 10);

}

/*

* 获取hbase的表

*/

publicstatic HTableInterface getTable(StringtableName) {

if (StringUtils.isEmpty(tableName))

returnnull;

returntp.getTable(getBytes(tableName));

}

/* 转换byte数组 */

publicstaticbyte[] getBytes(String str) {

if (str == null)

str= "";

return Bytes.toBytes(str);

}

/**

* 查询数据

* @param tableKey 表标识

* @param queryKey 查询标识

* @param startRow 开始行

* @param paramsMap 参数集合

* @return结果集

*/

publicstatic TBData getDataMap(StringtableName, String startRow,

StringstopRow, Integer currentPage, Integer pageSize)

throws IOException {

List<Map<String, String>>mapList = null;

mapList = new LinkedList<Map<String,String>>();

ResultScanner scanner = null;

// 为分页创建的封装类对象,下面有给出具体属性

TBData tbData = null;

try {

// 获取最大返回结果数量

if (pageSize == null || pageSize == 0L)

pageSize = 100;

if (currentPage == null || currentPage == 0)

currentPage = 1;

// 计算起始页和结束页

IntegerfirstPage = (currentPage - 1) * pageSize;

IntegerendPage = firstPage + pageSize;

// 从表池中取出HBASE表对象

HTableInterfacetable = getTable(tableName);

// 获取筛选对象

Scanscan = getScan(startRow, stopRow);

// 给筛选对象放入过滤器(true标识分页,具体方法在下面)

scan.setFilter(packageFilters(true));

// 缓存1000条数据

scan.setCaching(1000);

scan.setCacheBlocks(false);

scanner= table.getScanner(scan);

int i = 0;

List<byte[]> rowList = new LinkedList<byte[]>();

// 遍历扫描器对象, 并将需要查询出来的数据row key取出

for (Result result : scanner) {

String row = toStr(result.getRow());

if (i >= firstPage && i< endPage) {

rowList.add(getBytes(row));

}

i++;

}

// 获取取出的row key的GET对象

List<Get>getList = getList(rowList);

Result[]results = table.get(getList);

// 遍历结果

for (Result result : results) {

Map<byte[], byte[]> fmap = packFamilyMap(result);

Map<String, String> rmap = packRowMap(fmap);

mapList.add(rmap);

}

// 封装分页对象

tbData= new TBData();

tbData.setCurrentPage(currentPage);

tbData.setPageSize(pageSize);

tbData.setTotalCount(i);

tbData.setTotalPage(getTotalPage(pageSize, i));

tbData.setResultList(mapList);

} catch (IOException e) {

e.printStackTrace();

} finally {

closeScanner(scanner);

}

return tbData;

}

privatestaticint getTotalPage(int pageSize, int totalCount) {

int n = totalCount / pageSize;

if (totalCount % pageSize == 0) {

return n;

} else {

return ((int) n) + 1;

}

}

// 获取扫描器对象

privatestatic Scan getScan(String startRow,String stopRow) {

Scan scan = new Scan();

scan.setStartRow(getBytes(startRow));

scan.setStopRow(getBytes(stopRow));

return scan;

}

/**

* 封装查询条件

*/

privatestatic FilterList packageFilters(boolean isPage) {

FilterList filterList = null;

// MUST_PASS_ALL(条件 AND) MUST_PASS_ONE(条件OR)

filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);

Filter filter1 = null;

Filter filter2 = null;

filter1 = newFilter(getBytes("family1"), getBytes("column1"),

CompareOp.EQUAL, getBytes("condition1"));

filter2 = newFilter(getBytes("family2"), getBytes("column1"),

CompareOp.LESS, getBytes("condition2"));

filterList.addFilter(filter1);

filterList.addFilter(filter2);

if (isPage) {

filterList.addFilter(new FirstKeyOnlyFilter());

}

return filterList;

}

privatestatic Filter newFilter(byte[] f, byte[] c, CompareOp op, byte[] v) {

returnnew SingleColumnValueFilter(f, c, op,v);

}

privatestaticvoid closeScanner(ResultScannerscanner) {

if (scanner != null)

scanner.close();

}

/**

* 封装每行数据

*/

privatestatic Map<String, String>packRowMap(Map<byte[], byte[]> dataMap) {

Map<String, String> map = new LinkedHashMap<String, String>();

for (byte[] key : dataMap.keySet()) {

byte[] value = dataMap.get(key);

map.put(toStr(key), toStr(value));

}

return map;

}

/* 根据ROW KEY集合获取GET对象集合 */

privatestatic List<Get> getList(List<byte[]> rowList) {

List<Get> list = new LinkedList<Get>();

for (byte[] row : rowList) {

Getget = new Get(row);

get.addColumn(getBytes("family1"), getBytes("column1"));

get.addColumn(getBytes("family1"), getBytes("column2"));

get.addColumn(getBytes("family2"), getBytes("column1"));

list.add(get);

}

return list;

}

/**

* 封装配置的所有字段列族

*/

privatestatic Map<byte[], byte[]> packFamilyMap(Result result){

Map<byte[], byte[]> dataMap = null;

dataMap = new LinkedHashMap<byte[], byte[]>();

dataMap.putAll(result.getFamilyMap(getBytes("family1")));

dataMap.putAll(result.getFamilyMap(getBytes("family2")));

return dataMap;

}

privatestatic String toStr(byte[] bt) {

return Bytes.toString(bt);

}

publicstaticvoid main(String[] args) throws IOException {

// 拿出row key的起始行和结束行

// #<0<9<:

String startRow = "aaaa#";

String stopRow = "aaaa:";

int currentPage = 1;

int pageSize = 20;

// 执行hbase查询

getDataMap("table", startRow, stopRow, currentPage,pageSize);

}

}

class TBData {

private Integer currentPage;

private Integer pageSize;

private Integer totalCount;

private Integer totalPage;

private List<Map<String, String>> resultList;

public Integer getCurrentPage() {

returncurrentPage;

}

publicvoid setCurrentPage(IntegercurrentPage) {

this.currentPage = currentPage;

}

public Integer getPageSize() {

returnpageSize;

}

publicvoid setPageSize(Integer pageSize) {

this.pageSize = pageSize;

}

public Integer getTotalCount() {

returntotalCount;

}

publicvoid setTotalCount(Integer totalCount){

this.totalCount = totalCount;

}

public Integer getTotalPage() {

returntotalPage;

}

publicvoid setTotalPage(Integer totalPage) {

this.totalPage = totalPage;

}

public List<Map<String, String>> getResultList() {

returnresultList;

}

publicvoidsetResultList(List<Map<String, String>> resultList) {

this.resultList = resultList;

}

}

转载于:https://blog.51cto.com/maxli/1643453

hbase分页查询实现相关推荐

  1. HBase分页查询API

    使用API对Hbase的存储的数据进行分页显示: 实现思路:把pageIndex转换成startRow.让每一页的最后一个rowkey往后挪动一点位置,但是又不会是下一页的startRow. 主程序代 ...

  2. 记录一次HBase的scan的分页查询

    修改前任bug,Hbase查询过于慢了,以至于都查不出来了,看了代码发现使用的Scan只设置了withStartRow.withEndRow.setCaching扫描,拿到全部数据后存入集合再subL ...

  3. Java连接HBASE数据库,创建一个表,删除一张表,修改表,输出插入,修改,数据删除,数据获取,显示表信息,过滤查询,分页查询,地理hash

    准备工作 1.创建Java的Maven项目 创建好的目录结构如下: 另外注意junit的版本,最好不要太高,最开始笔者使用的junit4.12的,发现运行的时候会报错.最后把Junit的版本改成4.7 ...

  4. hbase实现分页查询

    [Author]: kwu hbase实现分页查询,实现按时间查询最新的15条,hbase的查询主要是通过rowkey来进行的,保证查询的高效.column的filter查询效率较低. 1.rowke ...

  5. es分页查询重复数据_ES优化 - 巨量数据如何提高查询性能

    问题:如果数据量特别大,如何优化ES的查询性能? 可以从以下几个方面进行思考: File Cache可用的内存: ES的查询严重依赖OS的File Cache,所以说内存分配的内存肯定是越多越好.最理 ...

  6. HBase2.1.0分页查询(支持跳页)

    HBase分页 hbase中的数据是按照rowkey字典排序存储的,实现分页的思路有两个,一个是获取页面的起始rowkey,然后使用PageFilter来限制每页的数量. 另一种是获取页面的起始row ...

  7. [JAVA EE] JPA 查询用法:自定义查询,分页查询

    项目已上传:https://codechina.csdn.net/qq_36286039/javaee 自定义查询 问题:内置的crud功能不满足需求时如何添加自定义查询? 几种自定义查询方法 方法命 ...

  8. jpa分页查询_spring data jpa 居然提供了这么多查询方式!

    spring data jpa提供了多种查询方式,如下: 方法名称查询 继承Repository接口 测试代码 方法名称中支持的关键字(官方文档提供) 使用JPA命名查询 在User实体中定义jpql ...

  9. Oracle中分页查询语句

    Oracle分页查询语句使我们最常用的语句之一,下面就为您介绍的Oracle分页查询语句的用法,如果您对此方面感兴趣的话,不妨一看. Oracle分页查询语句基本上可以按照本文给出的格式来进行套用. ...

最新文章

  1. RASPBERRY PI PICO 开发板 基础测试
  2. Unity3D 多平台 预编译 宏定义
  3. 数据分析之全国热门景点分析
  4. mysql 替代 in_mysql用什么代替in
  5. Xamarin+vs2010部署错误:error MSB6004: 指定的任务可执行文件位置\sdk\\tools\zipalign.exe”无效...
  6. 惊天大神坑 关于 python-socketio 与 socket.io-client 版本兼容问题
  7. thinkphp上传
  8. Java中常见流的分类及简单讲解
  9. 使用Sqlloader处理数据
  10. Octotree Chrome插件离线安装 树形展示插件
  11. 学习笔记(14):程序员的数学:微积分-常用导数(一):最常用到的技巧
  12. ASP.net 2.0 中 WebResource.axd 管理资源的一些知识点
  13. android 应用引导用户去应用市场评论
  14. DxO FilmPack 5 for Mac(胶片模拟效果滤镜软件)
  15. error: RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected length was received.
  16. r语言提取cvs数据_r语言,csv数据,提取特定行
  17. FPGA 学习笔记:Vivado 2020.2 MicroBlaze MIG 测试 DDR3 篇一
  18. 机房环境监控系统机房守护者!
  19. 2021全球与中国视频编辑软件市场现状及未来发展趋势
  20. rpath添加依赖库搜索路径

热门文章

  1. 解决了一个堆破坏问题
  2. 使用Jstl异常:The absolute uri: http://java.sun.com/jsp/jstl/core cannotnbs
  3. Windows无法安装到这个磁盘 选中的磁盘具有MBR分区表解决方法
  4. 如何在GitHub上搜索提交消息?
  5. 如何检查python模块的版本?
  6. 如何在JavaScript中声明名称空间?
  7. 有PHP4的分支吗?
  8. Arduino采集Microzone遥控器信号(ROSMicrozoneBridge)
  9. 通过源码理解反射与注解是什么东西?
  10. Eigen教程(9)之Reshape,Slicing介绍