package page;
import java.io.IOException;
import java.util.Iterator;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
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.filter.Filter;
import org.apache.hadoop.hbase.filter.PageFilter;
//hbase分页用到两个方法,
//一个是scan.setstartrow(startrow.getBytes())
//再一个是hbase的过滤器中pageFilter实现类
//Filter f=new PageFilter(pagesize);
public class pageFenYe {
static Configuration conf=null;
static Connection connect=null;
static HBaseAdmin admin=null;
static HTable table=null;
//获取表连接对象 和表管理对象
public static void init() throws IOException{
//加载配置文件
conf=HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "hadoop02:2181,hadoop03:2181,hadoop04:2181");
//获取连接
connect = ConnectionFactory.createConnection(conf);
//获取dml的操作句柄 需要制定表名的
table = (HTable) connect.getTable(TableName.valueOf("stu_info"));
}
//设置分页的显示的条件-------起始位置、每一页显示的数据条数
public static ResultScanner paging(String startrow,int pagesize) throws IOException{
//创建扫描对象
Scan scan = new Scan();
//设置起始行键
if(!"".equals(startrow)&&startrow!=null){
scan.setStartRow(startrow.getBytes());//如果输出的输入的不合法返回第一页数据
}
//设置分页过滤
Filter f=new PageFilter(pagesize);
scan.setFilter(f);
ResultScanner scanner = table.getScanner(scan);//提交scan,将返回结果封装ResultScanner中
return scanner;
}
//封装一个(页码与起始位置的方法)转换方法
public static ResultScanner fenye(int index,int pagesize) throws IOException{
String startrow=getStartRow(index,pagesize); //起始位置与index的转发方法
ResultScanner fenye = paging(startrow, pagesize); //调用分页方法返回resultscanner对象
return fenye;
}
//真正的转化方法
public static String getStartRow(int index, int pagesize) throws IOException {
String startrow="";
for(int i=1;i<index;i++){
ResultScanner fenye = paging(startrow,pagesize+1);//从第一页遍历,每次多取一个值----第二页的第一条数据
String lastrow="";
Iterator<Result> iterator = fenye.iterator();
Result next=null;
while(iterator.hasNext()){
next = iterator.next(); //由于是迭代器,所有next得到的是最后一个值
}
lastrow = new String(next.getRow());
startrow = lastrow; //最后得到所在页码的第一条数据,将其赋值给startrow并返回
}
return startrow;
}
public static void main(String[] args) throws IOException {
init();
//最后将查询的页遍历输出
ResultScanner fenye = fenye(2, 5);
Iterator<Result> iterator = fenye.iterator();
while(iterator.hasNext()){
Result next = iterator.next();
System.out.println(new String(next.getRow())); //这里我只是输出了行键
}
}
}
hadoop之hbase数据分页查询
最新推荐文章于 2021-11-24 10:58:27 发布