java hbase 批量查询数据_HBase根据Rowkey批量查询数据JAVA API(一次查多条,返回多个记录)...
最近在生产中遇到了一个需求,前台给我多个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(一次查多条,返回多个记录)...相关推荐
- hbase查看表结构_HBase简介和基本命令
[162] 一.HBase简介 1.1什么是HBase HBase 是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,利用 HBASE 技 术可在廉价 PC Server 上搭建起大规模结构化存 ...
- java hbase 批量查询数据_java Hbase 批量读取
Hbase 一般使用传一个rowkey读取一个数据的方式进行数据的读取,然后将多个rowkey写成一个循环,这样性能不好.可以传一批rowkey然后,一块获取返回数据的方式进行查询. java 版本: ...
- hbase 按时刻查询_Hbase查询工具类,根据时间查询数据
1,需求:已知空气监测数据在hbase中存储,要求按照时间,查询citycode为110000(北京)一个月的数据,数据为每日的监测数据 ID ,CITYCODE,SO2 ,CO,NO2 ,O3, P ...
- Hbase-day05_bulkLoad实现批量导入_HBase中rowkey的设计_二级索引_Phoenix二级索引
hbase-day05 1.bulkLoad实现批量导入 优点: 如果我们一次性入库hbase巨量数据,处理速度慢不说,还特别占用Region资源, 一个比较高效便捷的方法就是使用 "Bul ...
- hbase 预分区_hbase的rowKey设计原则
前言 访问hbase table中的行,只有三种方式: 1 通过单个row key访问 2 通过row key的range 3 全表扫描 可以看出rowkey设计的好与坏直接决定了查询速度,在hbas ...
- java查询结果传入excel表格批量上传并压缩下载
service层方法 //文件路径private String outputAddr="/home/appdata/files"; //表格表头private static fin ...
- hbase中为何不能向表中插入数据_Hbase快速入门(超精炼总结)
基本概念: HBase是列簇式Key-Value存储系统,构建在HDFS之上的.支持随机插入和删除. 总结Hbase的架构核心,就两个字"有序" . 磁盘的读写,随机与顺序,相差3 ...
- java 倒序分页_翻动100万级的数据(自定义的MSSQL分页查询过程)
翻动 100 万级的数据 -- 只需几十毫秒 之揭秘篇:有详细的说明,不要错过. 感谢大家的支持!!! 昨天发了一个邀请,邀请大家帮忙测试,效果还可以,下面小结一下: 通过内部的计数器得知:访问次数是 ...
- Linux笔记-bash批量启动、停止、重启、查询状态指定Java进程(其他进行通用)
此篇博文记录了在centos7.5上,编写bash,实现批量启动,停止.重启.查询java(其他进程通用). 这里有下面几个知识点: 1. shell中如何使用数组: 2. shell中对数组进行遍历 ...
最新文章
- Oracle中Hint深入理解(原创)
- 【CV实践】图像检索从入门到进阶
- [unreal4入门系列之十] UE4添加角色到场景中
- 信号与系统第四章-第六章习题易错点整理
- 爬虫---Beautiful Soup 通过添加不同的IP请求
- 关于批量启动微服务的jar包_分布式任务抢占及系统监控服务 Radish
- oracle拼接字符串报错,Oracle 中wmsys.wm_concat拼接字符串,结果过长报错解决
- javaweb开发之处理表单上传文件和文件下载
- 作者:张澄(1979-),男,中国联合网络通信有限公司江苏省分公司互联网部大数据中心总监...
- linux命令逻辑运算:与、或、非、异或
- 博途中用的是c吗_博图WINCC里如何添加c脚本
- 建造者模式 生成器模式 创建型 设计模式(五)
- rabbitmq接收不到消息_springboot集成RabbitMQ接收消息及其高级特性
- 【优化分类】基于matlab遗传算法优化支持向量机分类(多输入多分类)【含Matlab源码 QF003期】
- winpe 卡巴斯基本升级内部错误
- git项目文件上不显示图标的问题(绿色,红色)
- ccfcsp-20190301小中大-JAVA语言
- TotalCommander常用操作
- opengl 知识点2
- 浅谈 MySQL 连表查询
热门文章
- Redis Desktop Manager 利用ssh连接 Redis
- SGU 0438 The Glorious Karlutka River =) 动态流
- error C3872: '0x3000': this character is not allowed in an identifier 解决方法
- IFRAME jquery 获取document对象
- ssh项目放到服务器上出现404,项目运行一段时间,后台程序无法启动,404错误
- java中的静态初始化是什么意思,Java中static静态变量的初始化完全解析
- 鸿蒙开源小米能用吗,鸿蒙2.0开源,任何品牌都可以使用!小米用不用?
- java 将图片转成二进制文件bin_java 问题:怎样把一个bin二进制图片文件用java代码打开?求解!...
- gitlab mysql启动不了_gitlab不支持mysql,这就是我学习PostgreSQL的原因
- 全球变暖java_第九届 蓝桥杯 JavaB组 全球变暖