HBase笔记6 过滤器
过滤器
过滤器是GET或者SCAN时过滤结果用的,相当于SQL的where语句
HBase中的过滤器创建后会被序列化,然后分发到各个region server中,region server会还原过滤器并使用,这样scan中,不满足条件的结果不会返回客户端
值过滤器: (针对所有列)
创建valueFilter实例: Filter filter=new ValueFilter(CompareFilter.CompareOp.EQUAL,new SubstringComparator("xxxx"));
CompareFileter包含一个枚举类,CompareOp,包含以下值:
SubstringComparator是一个比较器,可以判断目标字符串是否包含所指定的字符串
单列值过滤器:
相当于mycnf:name like "%wang%"
new SingleColumnValueFilter(Bytes.toBytes("my.cnf"),Bytes.toBytes("name"),CompareFilter.CompareOp.EQUAL,new SubstringComparator("wang"))
指定了列族 mycnf 列 name
注意:
遍历结果集时需要判断结果是否包含需要的列,没有则丢弃 或 使用过滤器列表,将列族过滤器,列过滤器和值过滤器放入过滤器列表,同时进行过滤
字符串完全匹配:
相当于mycnf:name=wang
比较数字:
相当于mycnf:age > 10
new SingleColumnValueFilter(Bytes.toBytes("my.cnf"),Bytes.toBytes("name"),CompareFilter.CompareOp.GREATER,new BinaryComparator(Bytes.toBytes(10)));
比较器:
正则表达式比较器 RegexStringComparator
空值比较器 Null Comparator
数字比较器 LongComparator
比特位比较器 BitComparator
字节数组前缀比较器 BinaryPrefixComparator
分页过滤器:
构造函数: PageFilter(long pagesize) pagesize就是每页的记录数
过滤器列表:
构造函数1: FileterList(List<Filter> rowFilters) 多个过滤器组成的列表
注意:过滤器列表添加的顺序不同,执行的结果也可能不同,原因在于执行顺序的不同,分页过滤器一定要放到最后
构造函数2:FilterList(Operator operator,List<Filter> rowFilters)
Operator可选值 MUST_PASS_ALL 相当于所有条件之间用AND连接
MUST_PASS_ONE 相当于所有条件之间用OR连接
构造函数3:FilterList(Operator operator) 默认内部存在一个List,可以使用一个addFilter方法来实现添加过滤器 FilterList.addFilter(Filter filter)
行键过滤器:
行过滤器:
相当于rowkey > row3
new RowFilter(CompareFilter.CompareOp.GREATER,new BinaryComparator(Bytes.toBytes("row3")))
多行范围过滤器:
构造函数: MultiRowRangeFilter(List<RowRange> list)
行键前缀过滤器:
模糊行键过滤器:
构造函数: public FuzzyRowFilter(List<Pair<byte[],byte[]>> fuzzyKeysData)
fuzzyKeysData是模糊匹配的表达式,包括行键 & 行键掩码
行键 就是匹配的行键关键字
行键掩码: 行键掩码长度必须与行键长度一致,需要模糊匹配的字符处标记为1,其他位置为0
包含结尾过滤器:
随机行过滤器:(对数据随机采样)
遍历一行随机的数字小于0.5则保留
列过滤器:
列族过滤器:
列过滤器:
列前缀过滤器
多列前缀过滤器:
列键过滤器: 只获取列名
构造函数: KeyOnlyFilter()
首次列键过滤器
构造函数:FirstKeyOnlyFilter()
列名范围过滤器:
单元格过滤器:
时间戳过滤器:
装饰过滤器
跳转过滤器
行中由一个列要跳过则整行跳过
全匹配过滤器:
若果一个过滤器filterKeyvalue()方法返回false,整体Scan会终止,即发现不符合结果时,终止,后面不查询
如何在HBAse中使用过滤器:
scan '表名',{FILETR => '过滤器'}
例: scan 'table',{FILTER => "(PrefixFilter('row1'))"}