文档章节

Hbase分页

sameLuo
 sameLuo
发布于 2014/11/25 16:48
字数 528
阅读 374
收藏 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
成都
程序员
中国HBase技术社区第一届meetup入群邀请

各位报名成功的HBase爱好者,请扫描以下微信二维码,加入本次HBase meetup消息通知群,后续会议相关通知,会在群里进行公布,请各位及时关注。 会议地址:北京望京阿里中心B座(各位6号到园区...

wenzi0563
05/31
0
0
Hbase高可用(HA)安装笔记

这是在前一篇Hadoop 3.1.1高可用(HA)集群安装笔记 基础上,进行的操作. 安装HBase vim conf/hbase-site.xml vim conf/regionservers nn01启动 访问web页面 master regionServer http://maste...

张shieppp
09/28
0
0
hbase单机模式的安装及启动

从apache官网上下载hbase的稳定版本:http://mirror.bit.edu.cn/apache/hbase/stable/hbase-1.1.2-bin.tar.gz 解压到本机上的任何一个目录,在我的电脑上是/home/jason/hbase:tar xvfz hbas...

z_jordon
2015/11/04
0
0
Hive学习总结之五:HBase和Hive的集成

Hive和Hbase有各自不同的特征:hive是高延迟、结构化和面向分析的,hbase是低延迟、非结构化和面向编程的。Hive数据仓库在hadoop上是高延迟的。Hive集成Hbase就是为了使用hbase的一些特性。如...

酷帅CoolBash
2013/03/10
0
0
利用EMR Hive关联云HBase

云HBase需要借助外部Hive对多表进行关联分析,后续云HBase将集成Spark,更加建议使用Spark分析HBase数据。本文简单介绍下如何利用EMR的Hive关联云HBase的表。 1. 环境准备 购买按量计费的EMR...

巴客
10/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

原型模式

1、原型模式-定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 克隆(浅度克隆->拷贝值类型或者引用,深度克隆->创建新的对象,开辟新的内存) 例如客户端知道抽象Pro...

阿元
今天
47
0
awk命令扩展使用操作

awk 中使用外部shell变量 示例1 [root@centos01 t1022]# A=888[root@centos01 t1022]# echo "" | awk -v GET_A=$A '{print GET_A}'888[root@centos01 t1022]# echo "aaaaaaaaaaaaa" | aw......

野雪球
今天
41
0
深入解析MySQL视图VIEW

Q:什么是视图?视图是干什么用的? A:视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。   通过视图,可以展现基表的部分数据;...

IT--小哥
今天
45
0
虚拟机学习之二:垃圾收集器和内存分配策略

1.对象是否可回收 1.1引用计数算法 引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时候计数器值为0的对象就是不可能...

贾峰uk
今天
40
0
smart-doc功能使用介绍

smart-doc从8月份底开始开源发布到目前为止已经迭代了几个版本。在这里非常感谢那些敢于用smart-doc去做尝试并积极提出建议的社区用户。因此决定在本博客中重要说明下smart-doc的功能,包括使...

上官胡闹
昨天
47
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部