文档章节

Hbase分页

sameLuo
 sameLuo
发布于 2014/11/25 16:48
字数 528
阅读 393
收藏 7

    和传统数据库不同,Hbase的分页非常的困难(就我的愚见,可以说hbase无法真正分页),在参考了网上一些代码后,写了一段hbase分页代码。其原理主要是,先查询出rowKey,对rowKey进行分页后,再通过分页后的rowKey进行数据查询。

public class HbaseHelp {

	private static Configuration conf = null; 
	/**
	 * hbase的连接
	 * 用于替代HtablePool
	 * 用此类创建Htable会提高效率
	 */
	private static HConnection conn = null;
	/**  
	 * 初始化配置  
	 */  
	static {  
	    conf = HBaseConfiguration.create();  
	    conf.set("hbase.zookeeper.quorum", PropertiesUtil.getPropertyString("hbase.zookeepe                r.quorum"));
	    conf.set("hbase.zookeeper.property.clientPort", PropertiesUtil.getPropertyString("h                base.zookeeper.property.clientPort"));
	    conf.set("hbase.zookeeper.master", "192.168.1.12:60000");
	    try {
			conn = HConnectionManager.createConnection(conf);
		} catch (IOException e) {
			System.out.println("创建连接失败");
			e.printStackTrace();
		}
	}  
	 private static HTableInterface getTable(String tableName) throws IOException{
		 return conn.getTable( tableName );
	
	 }
	 	 private static Scan getScan(String StartRow,String endRow){
		 
		Scan scan =  new Scan();
		if( StartRow!=null )
		    scan.setStartRow( toBytes(StartRow) );
		if( endRow!=null )
		    scan.setStopRow( toBytes(endRow) );
		//设置缓存数量
		scan.setCaching(1000);
		//开启缓存
		scan.setCacheBlocks(true);
		return scan;
	 }
	 private static Map<String,String> resultHandle(Result rs){
		Map<String,String> result = new HashMap<String, String>();
		Cell[] cells = rs.rawCells();
		result = new HashMap<String, String>();
		boolean isFirst = true;
		for( Cell cell:cells ){
			if( isFirst ){
				result.put( "rowKey" , toString( CellUtil.cloneRow(cell) ) );
				result.put("timeStamp", cell.getTimestamp()+"");
				isFirst = false;
			}
			result.put(toString( CellUtil.cloneQualifier(cell) ), 
					
					toString( CellUtil.cloneValue(cell) ));
		}
		return result;
	}
		private static void closeTable(HTableInterface table){
		if( table==null )
			return;
		try {
			table.close();
		} catch (Exception e) {
			System.out.println("关闭表"+table.getName()+"失败!!!!!!");
			e.printStackTrace();
		}
	}
	public static  List< Map<String,String> > scanByPage(String tableName,String StartRow,S            tring endRow,Integer currentPae,Integer pageSize,Filter ...filters){
		 
		 HTableInterface table = null;
		 List<byte[]> rowKeyList = new LinkedList<byte[]>();
		 List< Map<String,String> > result = new LinkedList<Map<String,String>>();
		 try {
			 //格式化输入信息
			 if( currentPae == null || currentPae == 0 )
				 currentPae = 1;
			 if( pageSize == null || pageSize == 0 )
				 pageSize = 100;
			 //计算分页的数据范围
			 int firstCount = (currentPae - 1) * pageSize; 
			 int maxCount = firstCount + pageSize - 1; 
			 table = getTable(tableName);
			 Scan scan = getScan(StartRow, endRow);
			 PageFilter filter = new PageFilter(maxCount+1);
			 scan.setFilter(filter);
			 scan.setMaxVersions();
			 if( filters!=null ){
				 for( int i=0;i<filters.length;i++ ){
					 scan.setFilter(filters[i]);
				 }
			 }
			 //TODO 只取rowkey
			 ResultScanner scanner = table.getScanner(scan);
			 int i=0;
			 //获取分页数据的rowKey
			 for( Result rs:scanner ){
				 byte[] rowKey = null;
				 if( i>=firstCount && i<=maxCount ){
					 rowKey = rs.getRow();
					 rowKeyList.add(rowKey);
				 }
				 i++;
			 }
			 //通过行健集合构建查询集合
			 List<Get> getList = getGetList(rowKeyList);
			 Result[] rss = table.get(getList);
			 Map<String, String> rsMap = null;
			 for( Result rs:rss ){
				 rsMap = resultHandle(rs);
				 result.add(rsMap);
			 }
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			closeTable(table);
		}
		 return result;
		
	 }
	 
}


© 著作权归作者所有

共有 人打赏支持
sameLuo
粉丝 5
博文 17
码字总数 18151
作品 0
成都
程序员
私信 提问
Apache HBase 出现信息泄漏漏洞

Apache HBase 因为远程拒绝服务、发现信息泄露漏洞和信息完整性出现问题。 受影响的版本有: HBase 0.98.0 - 0.98.12 HBase 1.0.0 - 1.0.1 HBase 1.1.0 HBase 0.96(受波及了) 逻辑错误导致...

oschina
2015/05/26
2.2K
6
中国HBase技术社区第一届Meetup资料大合集

2018年6月6号,由中国HBase技术社区组织,阿里云主办的中国第一次HBase Meetup在北京望京阿里中心举行,来自阿里、小米、滴滴、360等公司的各位HBase的PMC、committer共聚一堂,共同探讨HBa...

wenzi0563
2018/06/14
0
0
hbase 数据库简介安装与常用命令的使用

一:hbase 简介与架构功能 二:hbase 安装与配置 三:hbase 常见shell 命令操作 一:hbase 简介与架构功能 1.1 为什么要使用hbase 数据库 1.2 hbase 简介: 1.3 HBase与Hadoop的对比 1.4 HB...

flyfish225
2018/04/12
0
0
Sqoop数据导入到HBase遇上的问题及解决方法

  【IT168 技术】运行bin/sqoop import --connect jdbc:mysql://ip:port/database --username * --password **--hbase-bulkload --hbase-create-table --column-family info --hbase-row-k......

中国大数据
2018/05/31
0
0
搭建HBase的本地模式、伪分布式、全分布式和HA模式

一、安装HBase: 我这里选择的是hbase-1.3.1-bin.tar.gz版本解压HBase: tar -zxvf hbase-1.3.1-bin.tar.gz -C ~/training 配置HBase的环境变量: export HBASE_HOME=/root/training/hbase-1.......

李金泽
2018/07/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Cookie 显示用户上次访问的时间

import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.serv......

gwl_
今天
1
0
网络编程

第14天 网络编程 今日内容介绍  网络通信协议  UDP通信  TCP通信 今日学习目标  能够辨别UDP和TCP协议特点  能够说出UDP协议下两个常用类名称  能够说出TCP协议下两个常用类名称...

stars永恒
今天
1
0
二进制相关

二进制 众所周知计算机使用的是二进制,数字的二进制是如何表示的呢? 实际就是逢二进一。比如 2 用二进制就是 10。那么根据此可以推算出 5的二进制等于 10*10+1 即为 101。 在计算机中,负数以...

NotFound403
昨天
3
0
day22:

1、写一个getinterface.sh 脚本可以接受选项[i,I],完成下面任务: 1)使用格式:getinterface.sh [-i interface | -I ip] 2)当用户使用-i选项时,显示指定网卡的IP地址;当用户使用-I选项...

芬野de博客
昨天
2
0
Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现

自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注。虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭借阿里中间件团队的背景,还是得到不少...

程序猿DD
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部