hadoop之hbase資料分頁查詢
阿新 • • 發佈:2018-12-10
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())); //這裡我只是輸出了行鍵
}
}
}