Hbase分页
博客专区 > sameLuo 的博客 > 博客详情
Hbase分页
sameLuo 发表于3年前
Hbase分页
  • 发表于 3年前
  • 阅读 315
  • 收藏 7
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

摘要: Hbase作为当今非常流行的nosql,性能非常的优异,但是它的查询却并不是那么友好,最新在使用hbase做一个后台,用到了分页,和大家分享一下。

    和传统数据库不同,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;
		
	 }
	 
}


标签: Hbase
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 5
博文 9
码字总数 9266
×
sameLuo
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: