使用过滤器至少需要两类参数:
1.抽象操作符
2.比较器
作用及类型
1.在客户端判断数据是否满足条件,将满足条件的数据返回到客户端
2.过滤器类型:
| 比较过滤器 | 可应用于rowkey、列簇、列、列值过滤器 |
| 专用过滤器 | 只能适用于特定的过滤器 |
| 包装过滤器 | 包装过滤器就是通过包装其他过滤器以实现某些拓展的功能 |
比较过滤器:
比较过滤器均继承自CompareFilter,创建一个比较过滤器需要两个参数
1.比较运算符:LESS< , LESS_OR_EOUAL<=, EQUAL=, GREATER_OR_EQUAL>=
,NOT_EQUAL<>, NO_OP排除所有
2.比较器实例
| BinaryComparator | 按字节索引顺序比较指定字节数组,采用Bytes.compareTo(byte[]) |
| BinaryPrefixComparator | 通BinaryComparator,只是比较左端前缀的数据是否相同 |
| NullComparator | 判断给定的是否为空 |
| BitComparator | 按位比较 |
| RegexStringComparator | 提供一个正则的比较器,仅支持 EQUAL 和非EQUAL |
| SubstringComparator | 判断提供的子串是否出现 |
比较过滤器包括
rowkeyFilter(行键)过滤器
通过RowFilter与BinaryComparator过滤比rowKey (行键)小的所有值
public class HbaseFilter {
private Connection conn;
private Admin admin;
@Before
public void connection(){
try {
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum","master:2181,node1:2181,node2:2181");
conn= ConnectionFactory.createConnection(conf);
admin=conn.getAdmin();
System.out.println("成功获取数据库的连接对象"+conn);
System.out.println("成功获取数据库的操作对象"+admin);
}catch (Exception e){
e.printStackTrace();
}
}
/**
*通过RowFilter与BinaryComparator过滤比rowKey 1500100010小的所有值出来
*/
@Test
public void rowFilterWithBinaryComparator(){
try {
TableName tableName = TableName.valueOf("students");
if (!admin.tableExists(tableName)){
System.out.println(Bytes.toString(tableName.getName())+"表不存在,查询失败");
return;
}
Table students = conn.getTable(tableName);
Scan scan = new Scan();
BinaryComparator binaryComparator = new BinaryComparator(Bytes.toBytes("1500100010"));
RowFilter rowFilter = new RowFilter(CompareOperator.LESS, binaryComparator);
scan.setFilter(rowFilter);
ResultScanner studentsScanner = students.getScanner(scan);
Iterator<Result> resultIterator = studentsScanner.iterator();
while (resultIterator.hasNext()){
Result result = resultIterator.next();
HbaseUtil.printResult(result);
}
}catch (Exception e){
e.printStackTrace();
}
}
@After
public void close(){
if (admin!=null){
try {
admin.close();
}catch (Exception e){
e.printStackTrace();
}
}
if (conn!=null){
try {
conn.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
}
FamilyFilter(列簇)过滤器
通过FamilyFilter与SubstringComparator查询列簇名包含(xx)的所有列簇下面的数据
QualifierFilter(列名)过滤器
通过QualifierFilter与SubstringComparator查询列名包含(xx)的列的值
ValueFilter(列值)过滤器
通过ValueFilter与BinaryPrefixComparator 过滤出所有的单元格(cell)中值以 "施" 开头的学生 只查询列值是"施"前缀的这一列,其他列不查
专用过滤器
1.单列值过滤器(SingleColumnValueFilter)
会返回满足条件的cell所在行的所有cell的值
2.列值排除过滤器(SingleColumnValueExcludeFilter)
会排除掉指定的列,其他的列全部返回
3.前缀(prefix)过滤器(PrefixFilter)
查询以xxx开头的所有前缀的rowkey
4.分页过滤器(PageFilter)
@Test
public void pageFilter() {
try {
TableName tableName = TableName.valueOf("students");
Table students = conn.getTable(tableName);
//定义一些变量
//定义查询的页数
int pageNum = 5;
int pageDataNumber = 10;
//设置最开始的行
Scan scan = new Scan();
scan.withStartRow(Bytes.toBytes(""));
//创建一个分页过滤器
PageFilter pageFilter = new PageFilter(pageDataNumber);
scan.setFilter(pageFilter);
for (int i = 1; i < pageNum; i++) {
System.out.println("=============当前是第 " + i + " 页数据==========");
ResultScanner studentsScanner = students.getScanner(scan);
Iterator<Result> resultIterator = studentsScanner.iterator();
while (resultIterator.hasNext()) {
Result result = resultIterator.next();
//TODO: 关键代码,查找下一条数据的关键
scan.withStartRow(Bytes.toBytes(Bytes.toString(result.getRow()) + "0"));
HbaseUtil.printResult(result);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
包装过滤器
1.SkipFilter过滤器
/**
* SkipFiler
*/
@Test
public void skipFilter(){
try {
TableName tableName = TableName.valueOf("students");
Table students = conn.getTable(tableName);
ValueFilter valueFilter = new ValueFilter(CompareOperator.NOT_EQUAL, new BinaryComparator(Bytes.toBytes("易政")));
SkipFilter skipFilter = new SkipFilter(valueFilter);
Scan scan = new Scan();
scan.setFilter(skipFilter);
ResultScanner resultScanner = students.getScanner(scan);
Iterator<Result> iterator = resultScanner.iterator();
while (iterator.hasNext()){
Result result = iterator.next();
HbaseUtil.printResult(result);
}
}catch (Exception e){
e.printStackTrace();
}
}
2.WhileMatchFilter过滤器
当被包装的过滤器遇到一个需要过滤的 KeyValue 实例时,WhileMatchFilter 则结束本次扫描
1576

被折叠的 条评论
为什么被折叠?



