说明
RowFilter
是用来对 rowkey
进行过滤的
比较符
可以使用比较符(不支持符号,需要用英文单词),如下:
Operator | Description |
---|---|
LESS | 小于 |
LESS_OR_EQUAL | 小于等于 |
EQUAL | 等于 |
NOT_EQUAL | 不等于 |
GREATER_OR_EQUAL | 大于等于 |
GREATER | 大于 |
NO_OP | 排除所有 |
比较器
参见 链接
例子
关键方法
/**
*
* @param tableName 表名
* @param family 列族名
* @param column 列名
* @param startRow,指定开始的rowkey(包含)。如果不设置,则从表头开始
* @param stopRow,指定结束的rowkey(不包含)。如果不设置,则截止的末尾
* @param op 操作,=,>,>=,<,<=,!=
* @param rowComparator 比较器
* @throws IOException
*/
public List<CellData[]> filter(
String tableName,
String family,
String column,
String startRow,
String stopRow,
String op,
ByteArrayComparable rowComparator) 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));
}
RowFilter filter = new RowFilter(getCompareOperator(op),rowComparator);
//传入filter
scan.setFilter(filter);
//执行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;
}
比较符号转枚举方法
// 传入 =,>,>=,<,<=,!=,返回相对应的 CompareOperator
CompareOperator getCompareOperator(String op){
CompareOperator co = null;
switch (op) {
case "=":
co = CompareOperator.EQUAL;
break;
case ">":
co = CompareOperator.GREATER;
break;
case ">=":
co = CompareOperator.GREATER_OR_EQUAL;
break;
case "<":
co = CompareOperator.LESS;
break;
case "<=":
co = CompareOperator.LESS_OR_EQUAL;
break;
case "!=":
co = CompareOperator.NOT_EQUAL;
break;
default:
co = CompareOperator.NO_OP;
}
return co;
}
测试
public static void main(String[] args) throws IOException {
HbaseUtils2_RowFilter utils=new HbaseUtils2_RowFilter();
utils.connect("hadoop1,hadoop2,hadoop3","2181");
// XXX 关键:二进制比较器,查询 rowkey 大于 1002 的数据 XXX
BinaryComparator comparator = new BinaryComparator(Bytes.toBytes("1002"));
List<CellData[]> resList = utils.filter("book", "c1", null,null,null,
">", comparator);
for(CellData[] arr : resList){
for(CellData item : arr){
System.out.println(item.getFamily()+":"+item.getRowkey()+":"+item.getQualifier() +" == "+item.getValue());
}
System.out.println("----------");
}
utils.close();
}