最近在生产中遇到了一个需求,前台给我多个rowkey的List,要在hbase中查询多个记录(返回给前台list)。在网上也查了很多,不过自己都不太满意,filter的功能有可能查询结果不是准确值,而网上给出的get方法也都是返回一条,scan的话都是返回全部数据,还有用rowkey范围查询的,都跟我的这个应用场景不符啊。无奈,自己找了一个方法,给各位有同样需求的朋友们一个参考。

首先创建链接属性:

public static Configuration conf = null;

public static Connection connection = null;

public static Admin admin = null;

static {

conf = HBaseConfiguration.create();

conf.set("hbase.zookeeper.quorum", "10.120.193.800,10.120.193.810");

conf.set("hbase.master", "10.120.193.730:60010");

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

conf.set("zookeeper.znode.parent", "/hbase-unsecure");

conf.set("hbase.client.keyvalue.maxsize", "1048576000"); //1G

conf = HBaseConfiguration.create(conf);

try {

connection = ConnectionFactory.createConnection(conf);

admin = connection.getAdmin();

} catch (IOException e) {

e.printStackTrace();

}

}

紧接着,开始做查询操作:

public static List qurryTableTest(List rowkeyList) throws IOException {

String tableName = "table_a";

Table table = connection.getTable( TableName.valueOf(tableName));// 获取表

for (String rowkey : rowkeyList){

Get get = new Get(Bytes.toBytes(rowkey));

Result result = table.get(get);

for (Cell kv : result.rawCells()) {

String value = Bytes.toString(CellUtil.cloneValue(kv));

list.add(value);

}

}

return list;

}

但是!!!重点来了,每条rowkey都要发起一次请求,这种方法效率十分低,测试了10000条记录查询要用4分钟左右,项目需求是秒回啊,这怎么能行?

于是,就自己点开hbase java 源码,自己慢慢找,忽然眼前一亮!在HTable.class里看到了这个get方法:

public Result[] get(List gets) throws IOException {

if(gets.size() == 1) {

return new Result[]{this.get((Get)gets.get(0))};

} else {

try {

Object[] r1 = this.batch(gets);

Result[] results = new Result[r1.length];

int i = 0;

Object[] arr$ = r1;

int len$ = r1.length;

for(int i$ = 0; i$ < len$; ++i$) {

Object o = arr$[i$];

results[i++] = (Result)o;

}

return results;

} catch (InterruptedException var9) {

throw (InterruptedIOException)(new InterruptedIOException()).initCause(var9);

}

}

}

这就简单了,紧接着对自己上边的方法进行改进:

public static List qurryTableTestBatch(List rowkeyList) throws IOException {

List getList = new ArrayList();

String tableName = "table_a";

Table table = connection.getTable( TableName.valueOf(tableName));// 获取表

for (String rowkey : rowkeyList){//把rowkey加到get里,再把get装到list中

Get get = new Get(Bytes.toBytes(rowkey));

getList.add(get);

}

Result[] results = table.get(getList);//重点在这,直接查getList

for (Result result : results){//对返回的结果集进行操作

for (Cell kv : result.rawCells()) {

String value = Bytes.toString(CellUtil.cloneValue(kv));

list.add(value);

}

}

return list;

}

根据这种批量的方法,10000个rowkey进行测试,时间为2s,速度提升特别大。

ok!大功告成,成功解决了问题~

java hbase 批量查询数据_HBase根据Rowkey批量查询数据JAVA API(一次查多条,返回多个记录)...相关推荐

  1. hbase查看表结构_HBase简介和基本命令

    [162] 一.HBase简介 1.1什么是HBase HBase 是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,利用 HBASE 技 术可在廉价 PC Server 上搭建起大规模结构化存 ...

  2. java hbase 批量查询数据_java Hbase 批量读取

    Hbase 一般使用传一个rowkey读取一个数据的方式进行数据的读取,然后将多个rowkey写成一个循环,这样性能不好.可以传一批rowkey然后,一块获取返回数据的方式进行查询. java 版本: ...

  3. hbase 按时刻查询_Hbase查询工具类,根据时间查询数据

    1,需求:已知空气监测数据在hbase中存储,要求按照时间,查询citycode为110000(北京)一个月的数据,数据为每日的监测数据 ID ,CITYCODE,SO2 ,CO,NO2 ,O3, P ...

  4. Hbase-day05_bulkLoad实现批量导入_HBase中rowkey的设计_二级索引_Phoenix二级索引

    hbase-day05 1.bulkLoad实现批量导入 优点: 如果我们一次性入库hbase巨量数据,处理速度慢不说,还特别占用Region资源, 一个比较高效便捷的方法就是使用 "Bul ...

  5. hbase 预分区_hbase的rowKey设计原则

    前言 访问hbase table中的行,只有三种方式: 1 通过单个row key访问 2 通过row key的range 3 全表扫描 可以看出rowkey设计的好与坏直接决定了查询速度,在hbas ...

  6. java查询结果传入excel表格批量上传并压缩下载

    service层方法 //文件路径private String outputAddr="/home/appdata/files"; //表格表头private static fin ...

  7. hbase中为何不能向表中插入数据_Hbase快速入门(超精炼总结)

    基本概念: HBase是列簇式Key-Value存储系统,构建在HDFS之上的.支持随机插入和删除. 总结Hbase的架构核心,就两个字"有序" . 磁盘的读写,随机与顺序,相差3 ...

  8. java 倒序分页_翻动100万级的数据(自定义的MSSQL分页查询过程)

    翻动 100 万级的数据 -- 只需几十毫秒 之揭秘篇:有详细的说明,不要错过. 感谢大家的支持!!! 昨天发了一个邀请,邀请大家帮忙测试,效果还可以,下面小结一下: 通过内部的计数器得知:访问次数是 ...

  9. Linux笔记-bash批量启动、停止、重启、查询状态指定Java进程(其他进行通用)

    此篇博文记录了在centos7.5上,编写bash,实现批量启动,停止.重启.查询java(其他进程通用). 这里有下面几个知识点: 1. shell中如何使用数组: 2. shell中对数组进行遍历 ...

最新文章

  1. Oracle中Hint深入理解(原创)
  2. 【CV实践】图像检索从入门到进阶
  3. [unreal4入门系列之十] UE4添加角色到场景中
  4. 信号与系统第四章-第六章习题易错点整理
  5. 爬虫---Beautiful Soup 通过添加不同的IP请求
  6. 关于批量启动微服务的jar包_分布式任务抢占及系统监控服务 Radish
  7. oracle拼接字符串报错,Oracle 中wmsys.wm_concat拼接字符串,结果过长报错解决
  8. javaweb开发之处理表单上传文件和文件下载
  9. 作者:张澄(1979-),男,中国联合网络通信有限公司江苏省分公司互联网部大数据中心总监...
  10. linux命令逻辑运算:与、或、非、异或
  11. 博途中用的是c吗_博图WINCC里如何添加c脚本
  12. 建造者模式 生成器模式 创建型 设计模式(五)
  13. rabbitmq接收不到消息_springboot集成RabbitMQ接收消息及其高级特性
  14. 【优化分类】基于matlab遗传算法优化支持向量机分类(多输入多分类)【含Matlab源码 QF003期】
  15. winpe 卡巴斯基本升级内部错误
  16. git项目文件上不显示图标的问题(绿色,红色)
  17. ccfcsp-20190301小中大-JAVA语言
  18. TotalCommander常用操作
  19. opengl 知识点2
  20. 浅谈 MySQL 连表查询

热门文章

  1. Redis Desktop Manager 利用ssh连接 Redis
  2. SGU 0438 The Glorious Karlutka River =) 动态流
  3. error C3872: '0x3000': this character is not allowed in an identifier 解决方法
  4. IFRAME jquery 获取document对象
  5. ssh项目放到服务器上出现404,项目运行一段时间,后台程序无法启动,404错误
  6. java中的静态初始化是什么意思,Java中static静态变量的初始化完全解析
  7. 鸿蒙开源小米能用吗,鸿蒙2.0开源,任何品牌都可以使用!小米用不用?
  8. java 将图片转成二进制文件bin_java 问题:怎样把一个bin二进制图片文件用java代码打开?求解!...
  9. gitlab mysql启动不了_gitlab不支持mysql,这就是我学习PostgreSQL的原因
  10. 全球变暖java_第九届 蓝桥杯 JavaB组 全球变暖