使用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());
}
}