整合使用
/**
* @describe:定义一个方法,接受一个过滤器,返回结果数据
* @Param: [filter] 过滤
* @Return: void
*/
public void testScan(Filter filter) throws Exception {
//拿到表对象
Table table = conn.getTable(TableName.valueOf("t_user_info"));
Scan scan = new Scan();
//设置过滤器
scan.setFilter(filter);
//返回满足条件的结果
ResultScanner scanner = table.getScanner(scan);
//以迭代器的形式返回
Iterator<Result> iter = scanner.iterator();
while (iter.hasNext()) {
Result result = iter.next();
CellScanner cellScanner = result.cellScanner();
while (cellScanner.advance()) {
Cell current = cellScanner.current();
byte[] rowArray = current.getRowArray();
byte[] familyArray = current.getFamilyArray();
byte[] valueArray = current.getValueArray();
byte[] qualifierArray = current.getQualifierArray();
//打印结果
System.out.println(new String(rowArray, current.getRowOffset(), current.getRowLength()));
System.out.print(new String(familyArray, current.getFamilyOffset(), current.getFamilyLength()));
System.out.print(":" + new String(qualifierArray, current.getQualifierOffset(), current.getQualifierLength()));
System.out.println(" " + new String(valueArray, current.getValueOffset(), current.getValueLength()));
}
System.out.println("-----------------------");
}
}
/**
* 过滤器使用
*
* @throws Exception
*/
@Test
public void testFilter() throws Exception {
// 1.针对行键的前缀过滤器(将字符串转化成字节数组)
/* Filter pf = new PrefixFilter(Bytes.toBytes("liu"));
testScan(pf);*/
// 2.行过滤器 需要一个 比较运算符 和 比较器(比user002小的都可以打印出来的user002)
/* RowFilter rf1 = new RowFilter(CompareOp.LESS, new BinaryComparator(Bytes.toBytes("user002")));
testScan(rf1);*/
/*RowFilter rf2 = new RowFilter(CompareOp.EQUAL, new SubstringComparator("01"));//rowkey包含"01"子串的
testScan(rf2);*/
// 3.针对指定一个列的value来过滤(把passwoord等于123456 的打印出来)
//SingleColumnValueFilter scvf = new SingleColumnValueFilter("base_info".getBytes(), "password".getBytes(), CompareOp.EQUAL, "123456".getBytes());
/* SingleColumnValueFilter scvf = new SingleColumnValueFilter("base_info".getBytes(), "password".getBytes(), CompareOp.LESS, "zzzz".getBytes());
scvf.setFilterIfMissing(false); // true表示如果指定的列缺失,则也过滤掉不显示,为false表示不过滤也显示(测试一下)
testScan(scvf);*/
//4.针对指定一个列的value的比较器来过滤
// ByteArrayComparable comparator1 = new RegexStringComparator("^zhang"); //以zhang开头的
// ByteArrayComparable comparator2 = new SubstringComparator("si"); //包含"si"子串
// SingleColumnValueFilter scvf = new SingleColumnValueFilter("base_info".getBytes(), "username".getBytes(), CompareOp.EQUAL, comparator1);
// SingleColumnValueFilter scvf = new SingleColumnValueFilter("base_info".getBytes(), "username".getBytes(), CompareOp.EQUAL, comparator2);
// testScan(scvf);
//5.针对列族名的过滤器 返回结果中只会包含满足条件的列族中的数据
//列簇是basicInfo的打印出来
/* FamilyFilter ff1 = new FamilyFilter(CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("base_info"))); //
//列簇是一base开头的信息
FamilyFilter ff2 = new FamilyFilter(CompareOp.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("base")));
testScan(ff2);*/
//6.针对列名的过滤器 返回结果中只会包含满足条件的列的数据
/*QualifierFilter qf1 = new QualifierFilter(CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("password")));
QualifierFilter qf2 = new QualifierFilter(CompareOp.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("user")));
testScan(qf1);
testScan(qf2);*/
//7.跟SingleColumnValueFilter结果不同,只返回符合条件的该column
//列族的前缀
/* ColumnPrefixFilter cf = new ColumnPrefixFilter("passw".getBytes());
testScan(cf);*/
//8.多个列进行过滤,只需要满足一个条件就可以,是或者的关系
/* byte[][] prefixes = new byte[][] { Bytes.toBytes("username"),Bytes.toBytes("password") };
MultipleColumnPrefixFilter mcf = new MultipleColumnPrefixFilter(prefixes);
testScan(mcf);*/
//9.多个过滤器同时使用
FamilyFilter ff2 = new FamilyFilter(CompareOp.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("base")));
ColumnPrefixFilter cf = new ColumnPrefixFilter("password".getBytes());
FilterList filterList = new FilterList(Operator.MUST_PASS_ALL);
filterList.addFilter(ff2);
filterList.addFilter(cf);
testScan(filterList);
}