使用java HBase API查询 小bug记录
2016-01-26 17:55
423 查看
java HBase API查询时代码部分如下:
Scan scan = new Scan();
//scan.setCaching(1);
scan.setStartRow(QueryUtils.byteArray(Bytes.toBytes(indexCol),Bytes.toBytes(startRow),Bytes.toBytes(keyStartZero)));
scan.setStopRow(QueryUtils.byteArray(Bytes.toBytes(indexCol),Bytes.toBytes(endRow),Bytes.toBytes(keyEndMax)));
<strong> <span style="color:#cc0000;">scan.setBatch(1);</span></strong>
scan.addFamily(Bytes.toBytes(hbaseFamily));
LOGGER.info("[XdrIndexScanTask]inner process!");
try{
ResultScanner rs = table.getScanner(scan);
if (null != rs) {
for (Result r : rs) {
for (Cell cell : r.rawCells()) {
String out = new String(CellUtil.cloneValue(cell)); Map<String, Object> valueMap = JSON.parseObject(out);
for (String fileName : valueMap.keySet()) {
List<Long> resultList = (List<Long>) valueMap.get(fileName);
if(null!=resultList)
{
//如果仅仅以时间为查询条件,查询结果不会存在交集。
List<List<Long>> resultLists = resultMap.get(fileName);要注意其中标红的一行代码,查询HBase 使用scan的时候如果不设置 setBatch,将会导致每次scan出来的结果数目不一致。
关于scan的其他设置有如下:
public void setBatch(int batch) :
为设置获取记录的列个数,默认无限制,也就是返回所有的列
public void setCaching(int caching):
每次从服务器端读取的行数,默认为配置文件中设置的值
public void setCacheBlocks(boolean cacheBlocks):
为是否缓存块,默认缓存,我们分内存,缓存和磁盘,三种方式,一般数据的读取为内存->缓存->磁盘,当MR的时候为非热点数据,因此不需要缓存
因此在MR的时候最好设置如下:
Scan scan = new Scan();
//scan.setCaching(1);
scan.setStartRow(QueryUtils.byteArray(Bytes.toBytes(indexCol),Bytes.toBytes(startRow),Bytes.toBytes(keyStartZero)));
scan.setStopRow(QueryUtils.byteArray(Bytes.toBytes(indexCol),Bytes.toBytes(endRow),Bytes.toBytes(keyEndMax)));
<strong> <span style="color:#cc0000;">scan.setBatch(1);</span></strong>
scan.addFamily(Bytes.toBytes(hbaseFamily));
LOGGER.info("[XdrIndexScanTask]inner process!");
try{
ResultScanner rs = table.getScanner(scan);
if (null != rs) {
for (Result r : rs) {
for (Cell cell : r.rawCells()) {
String out = new String(CellUtil.cloneValue(cell)); Map<String, Object> valueMap = JSON.parseObject(out);
for (String fileName : valueMap.keySet()) {
List<Long> resultList = (List<Long>) valueMap.get(fileName);
if(null!=resultList)
{
//如果仅仅以时间为查询条件,查询结果不会存在交集。
List<List<Long>> resultLists = resultMap.get(fileName);要注意其中标红的一行代码,查询HBase 使用scan的时候如果不设置 setBatch,将会导致每次scan出来的结果数目不一致。
关于scan的其他设置有如下:
public void setBatch(int batch) :
为设置获取记录的列个数,默认无限制,也就是返回所有的列
public void setCaching(int caching):
每次从服务器端读取的行数,默认为配置文件中设置的值
public void setCacheBlocks(boolean cacheBlocks):
为是否缓存块,默认缓存,我们分内存,缓存和磁盘,三种方式,一般数据的读取为内存->缓存->磁盘,当MR的时候为非热点数据,因此不需要缓存
因此在MR的时候最好设置如下:
scan.setCacheBlocks(false); scan.setCaching(200);//大了占内存,但是rpc少 scan.setBatch(6);//你需要的列
相关文章推荐
- Facebook's New Real-time Messaging System: HBase to Store 135+ Billion Messages a Month
- Hadoop生态上几个技术的关系与区别:hive、pig、hbase 关系与区别
- 基于HBase Thrift接口的一些使用问题及相关注意事项的详解
- 简单谈谈MySQL的loose index scan
- 如何解决struts2日期类型转换
- 基于Java实现杨辉三角 LeetCode Pascal's Triangle
- hbase shell基础和常用命令详解
- 手把手教你配置Hbase完全分布式环境
- 实战:在Java Web 项目中使用HBase
- HBase RowKey设计的那些事
- Spark中将对象序列化存储到hdfs
- HBase基本原理
- HBase中的基本概念
- 【原创】基于分布式存储的开源系统在实时数据库海量历史数据存储项目上的预研
- HBase0.96.x开发使用(一)--安装
- 基于外部ZooKeeper的GlusterFS作为分布式文件系统的完全分布式HBase集群安装指南
- 基于solr实现hbase的二级索引
- 非mapreduce生成Hfile,然后导入hbase当中