说明
本文使用 java api 实现 scan
命令
注意:该 scan
扫描查询非常重要,过滤器都是基于该方式实现的
常用方法
scan.addFamily()
:返回指定的 family,否则返回所有scan.addColumn()
:返回指定的 family、column,否则返回所有scan.setFilter()
:指定 Filter 过滤数据
设置开始rowkey
指定开始的rowkey(包含),如果不设置,则从表头开始
注意:rowKey
是按ASCII码表升序排列
有下面2个方法:
scan.withStartRow(byte[] startRow, boolean inclusive)
- 参数
inclusive
:若为true
,则包含指定的rowkey;若为false
,则不包含
- 参数
withStartRow(byte[] startRow):第二个参数默认为
ture
设置截止rowkey
指定结束的rowkey(不包含)。如果不设置,则截止的末尾
注意:rowKey
是按ASCII码表升序排列
有下面2个方法:
withStopRow(byte[] stopRow, boolean inclusive)
- 参数
inclusive
:若为true
,则包含指定的rowkey;若为false
,则不包含,默认为false
- 参数
withStopRow(byte[] stopRow):第二个参数默认为false
代码
关键代码
/**
*
* @param tableName
* @param family,返回指定的 family,指定null表示返回所有
* @param column,返回指定的 family、column,指定null表示返回所有
* @param startRow,指定开始的rowkey(包含)。如果不设置,则从表头开始
* @param stopRow,指定结束的rowkey(不包含)。如果不设置,则截止的末尾
* @return
* @throws IOException
*/
public List<CellData[]> scan(String tableName, String family, String column,String startRow,String stopRow) throws IOException {
Table table = conn.getTable(TableName.valueOf(tableName));
//创建Scan
Scan scan=new Scan();
// 返回指定的 family、column,不指定表示返回所有
if(column!=null && !"".equals(column)) {
scan.addColumn(Bytes.toBytes(family), Bytes.toBytes(column));
}
// 返回指定的 family,不指定表示返回所有
if(family!=null && !"".equals(family) && (column==null || "".equals(column))) {
scan.addFamily(Bytes.toBytes(family));
}
// 指定开始的行(包含)。如果不设置,则从表头开始
if(startRow!=null && !"".equals(startRow)) {
scan.withStartRow(Bytes.toBytes(startRow));
}
// 指定结束的行(不包含)。如果不设置,则截止的末尾
if(stopRow!=null && !"".equals(stopRow)) {
scan.withStopRow(Bytes.toBytes(stopRow));
}
//执行scan
ResultScanner resultScanner = table.getScanner(scan);
Iterator<Result> iterator = resultScanner.iterator();
List<CellData[]> retList = new ArrayList<>();
//迭代,在迭代时,ResultScanner会发送get请求
while(iterator.hasNext()){
Result result=iterator.next();
//获取rowkey
String rowkey=Bytes.toString(result.getRow());
// System.out.print(rowkey+"\t");
//获取所有单元格
List<Cell> list=result.listCells();
CellData[] arr = new CellData[list.size()];
int i = 0;
for(Cell item:list){
String familyOfDb=Bytes.toString(CellUtil.cloneFamily(item));
String qualifier=Bytes.toString(CellUtil.cloneQualifier(item));
String valueDb=Bytes.toString(CellUtil.cloneValue(item));
CellData cellData = new CellData(familyOfDb,qualifier,rowkey,item.getTimestamp(),valueDb);
arr[i] = cellData ;
i ++ ;
}
retList.add(arr);
}
//用完要及时关闭,在迭代时,ResultScanner会发送get请求
resultScanner.close();
table.close();
return retList;
}
添加测试数据
创建表:
create "book","c1"
清空表:
truncate 'book'
添加数据:
put 'book','1001','c1:title','htlm从入门到放弃'
put 'book','1001','c1:author','lucy'
put 'book','1001','c1:price','097.50'
put 'book','1002','c1:title','css从入门到放弃'
put 'book','1002','c1:author','lili'
put 'book','1002','c1:price','099.90'
put 'book','1003','c1:title','hadoop从入门到放弃'
put 'book','1003','c1:author','韩梅梅'
put 'book','1003','c1:price','190.00'
put 'book','1003','c1:title','hbase从入门到精通'
put 'book','1003','c1:author','李雷'
put 'book','1003','c1:price','029.50'
测试
public static void main(String[] args) throws IOException {
HbaseUtils1_scan utils=new HbaseUtils1_scan();
utils.connect();
// 返回 book 中所有列族、列的数据
// List<CellData[]> resList = utils.scan("book", null, null, null,null);
// 返回 book 中所有c1列族的数据
// List<CellData[]> resList = utils.scan("book", "c1", null, null,null);
// 返回 book 中所有c1列族、title列的数据
// List<CellData[]> resList = utils.scan("book", "c1", "title", null,null);
// 返回 book 中所有c1列族、title列,1002(包含) - 1021(不包含)的数据
List<CellData[]> resList = utils.scan("book", "c1", "title", "1002","1021");
for(CellData[] arr : resList){
for(CellData item : arr){
System.out.println(item.getFamily()+":"+item.getRowkey()+":"+item.getQualifier() +" == "+item.getValue());
// System.out.print(item.getFamily()+":"+item.getRowkey()+":"+item.getQualifier() +" == "+item.getValue()+"\t\t");
}
System.out.println("----------");
}
utils.close();
}
参考:
https://blog.csdn.net/weixin_39675289/article/details/114173634
https://blog.csdn.net/qq_34009542/article/details/120674233