您的位置:首页 > 其它

Hbase进行分页显示

2018-03-31 22:40 190 查看
使用API对Hbase的存储的数据进行分页显示:
思路:使用pagefilter和rowfilter(比较器使用GREATER),前者控制每页显示数目,后者控制当前页的起始元素。
分类:1、当输入页数小于等于1时,直接显示第一页,
2、当输入页数为2时,求出第一页的最后一个行键,作为比较值,
3、当输入页数大于等于3时,递归调用方法,求出前一页的最后一个行键即可
实现代码:package lpj.hbase.filter;

import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.client.Admin;
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.BinaryComparator;
import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.PageFilter;
import org.apache.hadoop.hbase.filter.RowFilter;

import habase.Utils.GetAdminAndTable;
import habase.Utils.PrintUtils;

public class FilterTest {

public static void main(String[] args) throws Exception {
//显示某张表的第几页pageIndex,几个值pageSize
getPageList("user_info",3, 2);
}
public static void getPageList(String tableName, int pageIndex, int pageSize){

Table table = GetAdminAndTable.geTable(tableName);

/**
* 通过过滤器获取结果
*/
Filter filter1 = new PageFilter(pageSize);//设置每页显示数目
/**
* 设置分页起始元素pageStartEle
*/
String pageStartEle = getPageStartEle(tableName,pageIndex,pageSize);
Filter filter2 = null;
if (pageStartEle == null) {
filter2 = new RowFilter(CompareOp.GREATER,new BinaryComparator(null));
}else {
filter2 = new RowFilter(CompareOp.GREATER,new BinaryComparator(pageStartEle.getBytes()));
}
Filter filter = new FilterList(filter1,filter2);
Scan scan = new Scan();
scan.setFilter(filter);
/**
* 获取并且打印元素
*/

ResultScanner scanner = null;
try {
scanner = table.getScanner(scan);
PrintUtils.printResultScanner(scanner);
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
table.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@SuppressWarnings("deprecation")
private static String getPageStartEle(String tableName, int pageIndex, int pageSize) {
//如果分页小于1,直接返回空值,即为第一页
if (pageIndex <= 1) {
return null;
}
//如果分页为2,第二页的起始大于第一页的最后一个行键,只要求出第一页的最后一个行键即可
if (pageIndex == 2) {
ResultScanner scanner = getScanner(tableName,pageIndex - 1,pageSize);
Iterator<Result> iterator = scanner.iterator();
String lastRoeKey = getKey(iterator);
return lastRoeKey;
}
//递归,以前一页的最后一个行键作为比较
else {
String pageStartEle = getPageStartEle(tableName,pageIndex - 1,pageSize);
Filter filter2 = new RowFilter(CompareOp.GREATER, new BinaryComparator(pageStartEle.getBytes()));
Filter filter1 = new PageFilter(pageSize);
Filter filter = new FilterList(filter1,filter2);
Scan scan = new Scan();
scan.setFilter(filter);
Table table = GetAdminAndTable.geTable(tableName);
ResultScanner scanner = null;
try {
scanner = table.getScanner(scan);
} catch (IOException e) {
e.printStackTrace();
}
Iterator<Result> iterator = scanner.iterator();
String lastRoeKey = getKey(iterator);
return lastRoeKey;
}
}
//获取迭代器最后元素
private static String getKey(Iterator<Result> iterator) {
Result lastRresult = null;
while(iterator.hasNext()){
lastRresult = iterator.next();
}
List<Cell> cells = lastRresult.listCells();
String lastRoeKey = null;
for(Cell cell : cells){
lastRoeKey = new String(cell.getRow());
}
return lastRoeKey;
}
//初始页面
public static ResultScanner getScanner(String tableName, int pageIndex, int pageSize) {
ResultScanner scanner = null;
Table table = GetAdminAndTable.geTable(tableName);
Filter filter1 = new PageFilter(pageSize);
Scan scan = new Scan();
scan.setFilter(filter1);
try {
scanner = table.getScanner(scan);
} catch (IOException e) {
e.printStackTrace();
}
return scanner;
}
}辅助类:package habase.Utils;

import java.util.Iterator;
import java.util.List;

import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;

public class PrintUtils {

public static void printResultScanner(ResultScanner scanner) {
Iterator<Result> iterator = scanner.iterator();
while(iterator.hasNext()){
Result next = iterator.next();
printResult(next);
}

}

public static void printResult(Result result) {
List<Cell> cells = result.listCells();
for(Cell cell: cells){
printCell(cell);
}
}

public static void printCell(Cell cell) {

System.out.println(new String(cell.getRow()) + "\t" + new String(cell.getFamily()) + "\t"
+ new String(cell.getQualifier()) + "\t" + new String(cell.getValue()) +
"\t" + cell.getTimestamp());

}

}package habase.Utils;

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 GetAdminAndTable {

private static final String CONNECT_KEY = "hbase.zookeeper.quorum";
private static final String CONNECT_VALUE = "hadoop02:2181,hadoop03:2181,hadoop04:2181";

private static Connection getConnect() {

Configuration config = HBaseConfiguration.create();
config.set(CONNECT_KEY, CONNECT_VALUE);

try {
return ConnectionFactory.createConnection(config);
} catch (IOException e) {
System.out.println("连接超时");
}
return null;
}

public static Admin getAdmin() {
try {
return getConnect().getAdmin();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public static Table geTable(String tableName) {

try {
return getConnect().getTable(TableName.valueOf(tableName));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}

}测试成功
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Hbase 分页显示