HBase过滤器Filter总结

一、HBase的scan可通过setStartRow、setStopRow对rowkey范围进行过滤

二、HBase中的get、scan都支持过滤器,过滤器在服务端生效,这样可以保证被过滤掉的数据不会被传送到客户端,从而提高了代码运行的效率。

三、过滤器可以根据列族、列、版本等更多的条件来对数据进行过滤,hbase中过滤器分类:

1、RowFilter

说明:筛选出匹配的所有的行,支持基于行键过滤数据,可以执行精确匹配,子字符串匹配或正则表达式匹配,过滤掉不匹配的数据。

用法:使用BinaryComparator可以筛选出具有某个行键的行,或者通过改变比较运算符来筛选出符合某一条件的多条数据

示例:扫描所有“firstRow”行的数据。

Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("firstRow")));  

RowFilter的使用关键在于CompareFilter.CompareOp这个内部枚举类,定义了7中比较运算符,供我们扫描操作,该类的定义如下:

@InterfaceAudience.Public  
  @InterfaceStability.Stable  
  public enum CompareOp {  
    /** less than */  
    LESS,  // 检查是否小于比较器里的值  
    /** less than or equal to */  
    LESS_OR_EQUAL,  // 检查是否小于或等于比较器里的值  
    /** equals */  
    EQUAL,  // 检查是否等于比较器里的值  
    /** not equal */  
    NOT_EQUAL, // 检查是否不等于比较器里的值  
    /** greater than or equal to */  
    GREATER_OR_EQUAL,  // 检查是否大于或等于比较器里的值  
    /** greater than */  
    GREATER,  // 检查是否大于比较器里的值  
    /** no operation */  
    NO_OP,  // 默认返回false,因此过滤掉所有的数据  
  }  

2、QualifierFilter

说明:该Filter是一种类似RowFilter的比较过滤器,不同之处是它用来匹配列限定符而不是行健

示例:扫描所有的列名为“name”的列数据。

Filter filter = new QualifierFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator("name"));  

3、PrefixFilter

说明:这是RowFilter的一种特例,它基于行健的前缀值进行过滤,它相当于给扫描构造函数Scan(byte[] startRow, byte[] stopRow),提供了一个停止键,只是你不需要自己计算停止键。

示例:过滤所有“second”前缀的行的数据

Filter filter = new PrefixFilter(Bytes.toBytes("second"));  

4、KeyOnlyFilter

说明:这个Filter只会返回每行的行键+列簇+列,而不返回值,对不需要值的应用场景来说,非常实用,减少了值的传递。

示例:

Filter filter = new KeyOnlyFilter();  

5、TimestampsFilter

说明:该过滤器允许针对返回给客户端的时间版本进行更细粒度的控制,使用的时候,可以提供一个返回的时间戳的列表,只有与时间戳匹配的单元才可以返回。当做多行扫描或者是单行检索时,如果需要一个时间区间,可以在Get或Scan对象上使用setTimeRange()方法来实现这一点。

示例:过滤时间戳列表中对应的列数据

List<Long> timestamps = new ArrayList<Long>();  
timestamps.add(1479788961691L);  
timestamps.add(1479788676517L);  
timestamps.add(1479788812565L);  
Filter filter = new TimestampsFilter(timestamps);  

6、FirstKeyOnlyFilter

说明:该Filter的作用,是找每一行的第一列数据,找到之后,就会停止扫描。

示例:

Filter filter = new FirstKeyOnlyFilter();  

7、ColumnPrefixFilter

说明:该Filter是按照列名的前缀来扫描单元格的,只会返回符合条件的列数据

Filter filter = new ColumnPrefixFilter(Bytes.toBytes("pay"));  

8、ValueFilter使用

说明:该Filter主要是对值进行过滤,用法和RowFilter类似,只不过侧重点不同而已,针对的是单元值,使用这个过滤器可以过滤掉不符合设定标准的所有单元

示例:

Filter filter = new ValueFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("100")));  

在这里,着重说下Comparator,hbase提供的内置的Comparator有如下几个:

BinaryComparator:会比较给定的值和扫描的值进行比对,如果一致则返回,使用Bytes.compareTo()方法比较。

BinaryPrefixComparator:如果扫描的值中带有给定的前缀,就会返回,使用Bytes.compareTo()方法,从左开始执行基于前缀的字节级比较

示例如下:

@Test  
public void testValueFilterBinaryPrefixComparator(){  
Filter filter = new ValueFilter(CompareFilter.CompareOp.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("cheng")));  
hService.get("ORDER_TABLE", filter);  
}  

NullComparator:检查给定值是否为空。

BitComparator:执行按位比较。

RegexStringComparator:把传递的值与比较器实例化时提供的正则表达式比较。

SubstringComparator:通过执行contains()方法,检查传递的值是否包含比较器提供的子字符串示例如下:

@Test  
  
public void testValueFilterSubstringComparator(){  
Filter filter = new ValueFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("123456"));  
hService.get("ORDER_TABLE", filter);  
}  

从上面的测试结果中,可以看出,只要是值中包含了“123456”字符串的结果,都返回了。

9、ColumnCountGetFilter

说明:该Filter用来返回每行最多返回多少列,但返回的总数不超过设置的列数

示例:

Filter filter = new ColumnCountGetFilter(2);  

10、SingleColumnValueFilter

说明:根据列的值来决定这一行数据是否返回,落脚点在行,而不是列。我们可以设置filter.setFilterIfMissing(true);如果为true,当这一列不存在时,不会返回,如果为false,当这一列不存在时,会返回所有的列信息。

先来测试这一列存在的情况,当列存在时,无论设置成true或者是false,测试结果没有影响

示例:

SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("user"), Bytes.toBytes("name"), CompareFilter.CompareOp.EQUAL, new SubstringComparator("chh"));  
filter.setFilterIfMissing(false);// 默认情况下为false  

 从上面的测试结果可以看出,当前列“name”存在,且前缀“chh”存在扫描的值“chhliu”中,而该值存在第一行中,所以返回第一行的所有数据。

11、SingleColumnValueExcludeFilter

说明:该Filter和SingleColumnValueFilter作用类似,唯一的区别在于,返回的数据不包含扫描条件的列。

示例:

Filter filter = new SingleColumnValueExcludeFilter(Bytes.toBytes("user"), Bytes.toBytes("name"), CompareFilter.CompareOp.EQUAL, new SubstringComparator("chh"));  

12、FilterList

说明:将多个过滤器组合到一起

示例:

Filter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("firstRow"))); // OK 筛选出匹配的所有的行    
Filter valueFilter = new ValueFilter(CompareFilter.CompareOp.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("yifu")));  
List<Filter> listFilter = new ArrayList<Filter>();  
listFilter.add(rowFilter);  
listFilter.add(valueFilter);  
Filter filter = new FilterList(listFilter);  

FilterList还支持多Filter的“AND”和“OR”操作,示例如下:

Filter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("firstRow"))); // OK 筛选出匹配的所有的行    
Filter valueFilter = new ValueFilter(CompareFilter.CompareOp.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("yifu")));  
List<Filter> listFilter = new ArrayList<Filter>();  
listFilter.add(rowFilter);  
listFilter.add(valueFilter);  
Filter filter = new FilterList(FilterList.Operator.MUST_PASS_ONE, listFilter);  

“AND”还是“OR”通过FilterList.Operator.MUST_PASS_ONE来指定,如果是MUST_PASS_ONR,则是“OR”的关系,如果是MUST_PASS_ALL,则是“AND”的关系,如果不传入这个参数,则默认为“AND”的关系。上面的测试中,使用的是“OR”的关系,也就是说,只要满足“firstRow”或者是“yifu”中的任意一个条件,都会被扫描出来。

参考:https://blog.csdn.net/leehbing/article/details/77028118

猜你喜欢

转载自blog.csdn.net/yuan1164345228/article/details/106730817