HBase分页查询API

使用API对Hbase的存储的数据进行分页显示:

实现思路:把pageIndex转换成startRow。让每一页的最后一个rowkey往后挪动一点位置,但是又不会是下一页的startRow。

主程序代码:

package hbase;

import java.util.Iterator;

import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.PageFilter;
import org.apache.hadoop.hbase.util.Bytes;

import util.HBasePrintUtil;
import util.HBaseUtil;
/**
 * HBase分页查询
 * @author potter
 */
public class HBase2 {

	public static void main(String[] args) throws Exception {
		
//		ResultScanner pageData = getPageData("baiyc_20150716_0007", 3);
//		HBasePrintUtil.printResultScanner(pageData);
		
		ResultScanner pageData2 = getPageData(1, 10);
		HBasePrintUtil.printResultScanner(pageData2);
		
	}
	/**
	 * @param pageIndex 	第几页
	 * @param pageSize		每一页的记录总数
	 * @return
	 * 
	 * 负责编写JS代码的前端人员。他们是不知道。怎么传入startRow                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
	 */
	public static ResultScanner getPageData(int pageIndex,int pageSize) throws Exception{
		
		if (pageSize < 3 || pageSize > 15) {
			pageSize = 5;
		}
		/**
		 * 当前这个代码的真实作用就是把:;
		 * 
		 * "baiyc_20150716_0001", 3
		 * 
		 * 转换成:
		 * 
		 * 2, 3
		 * 
		 * 难点: 就是  pageIndex 转成 startRow
		 */
		String startRow = GetCurrentPageStartRow(pageIndex,pageSize);		
		return getPageData(startRow,pageSize);
	}
	
	/**
	 * 	当前这个方法的作用:
	 * 
	 * 	就是把   前端人员 传送过来的    pageIndex  转换成  startRow
	 * 
	 *  以方便调用底层最简单的获取一页分页数据的 方法: getPageData(startRow, pageSize)
	 * 
	 * @param pageIndex
	 * @param pageSize
	 * @return
	 */
	private static String GetCurrentPageStartRow(int pageIndex, int pageSize) throws Exception {
			
		// 如果 传送过来的额  pageIndex 不合法。 默认返回 第一页数据
		if (pageIndex <=1) {
			return null;
		}else {
			//从第二页开始的所有数据。
			String startRow = null;
			
			for (int i = 1; i < pageIndex - 1; i++) {
				//第几次循环,就是获取第几页的数据
				ResultScanner pageData = getPageData(startRow, pageSize);
				//获取当前这一页的最后roekey
				Iterator<Result> iterator = pageData.iterator();
				Result result = null;
				while (iterator.hasNext()) {

					result = iterator.next();
				}
				//让最后一个rowkey往后挪动一点位置,但是又不会是下一页的startRow
				String endRowStr = new String(result.getRow());
				byte[] add = Bytes.add(endRowStr.getBytes(), new byte[]{ 0x00});
				
				String nextPageStartRowstr = Bytes.toString(add);
				
				startRow = nextPageStartRowstr;
			}
			return startRow;
		}
	}
	/**
	 * 描述:
	 * 
	 * 		从  startRow开始 查询 pageSize 条数据
	 * 
	 * @param startRow
	 * @param pageSize
	 * @return
	 */
	private static ResultScanner getPageData(String startRow, int pageSize) throws Exception {
		
		Connection con = HBaseUtil.getConnention();
		Table table = HBaseUtil.getTable("user_info");
		
		Scan scan = new Scan();
		
		//设置起始行键搞定
		//如果是第一页数据,所以scan.setStartRow这句代码根本就没有任何意义,不用设置即可
		if (!StringUtils.isBlank(startRow)) {
			
			//如果用户不传入startRow,或者传入一个非法的startRow,还是按照规则返回第一页
			scan.setStartRow(startRow.getBytes());
		}
		//设置总数据条件
		Filter pageFilter = new PageFilter(pageSize);
		scan.setFilter(pageFilter);
		ResultScanner scanner = table.getScanner(scan);
		
		return scanner;
	}
}

辅助类:

package util;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Table;


public class HBaseUtil {

	private static final String connect_Key = "hbase.zookeeper.quorum";
	private static final String connect_value = "potter2:2181,potter3:2181";
	
	
	public static Connection getConnention(){
		
		Configuration conf = HBaseConfiguration.create();
		conf.set(connect_Key, connect_value);
		Connection con = null;
		try {
			con = ConnectionFactory.createConnection(conf);
		} catch (IOException e) {
			System.out.println("获取连接失败");
		}
		return con;
	}
	
	public static Admin getAdmin(){
		
		Connection connection = getConnention();
		
		try {
			return connection.getAdmin();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return null;
	}
	
	public static Table getTable(String name){
		
		Connection connention = getConnention();
		
		try {
			return connention.getTable(TableName.valueOf(name));
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
		
	}
	
	
}

辅助类:

package util;

import java.util.List;

import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.util.Bytes;

public class HBasePrintUtil {

	public static void printResultScanner(ResultScanner resultScann) {
		for (Result result : resultScann) {
			printResult(result);
		}
	}

	public static void printResult(Result result) {
		List<Cell> cells = result.listCells();
		for (int i = 0; i < cells.size(); i++) {
			Cell cell = cells.get(i);
			printCell(cell);
		}
	}

	public static void printCell(Cell cell) {
		System.out.println(Bytes.toString(cell.getRow()) + "\t" + Bytes.toString(cell.getFamily()) + "\t" + Bytes.toString(cell.getQualifier())
				+ "\t" + Bytes.toString(cell.getValue()) + "\t" + cell.getTimestamp());
	}

	public static void printKeyValye(KeyValue kv) {
		System.out.println(Bytes.toString(kv.getRow()) + "\t" + Bytes.toString(kv.getFamily()) + "\t" + Bytes.toString(kv.getQualifier()) + "\t"
				+ Bytes.toString(kv.getValue()) + "\t" + kv.getTimestamp());
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值