hadoop之hbase数据分页查询

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())); //这里我只是输出了行键
        }

    }

}

猜你喜欢

转载自blog.csdn.net/YZY_001/article/details/82717375