1.之前写一个东西,用到了Hbase过滤器,现在写篇博客,把Hbase相关的过滤器总结一下
2.1下面举一个创建列名过滤类对象的例子
QualifierFilter f1 = new QualifierFilter(CompareFilter.CompareOp.EQUAL,new BinaryComparator(“face_time”.getBytes())); CompareFilter是一个抽象类,里面定义了枚举方法CompareOp 在枚举CompareOp中有如下操作符:
LESS, 小于 LESS_OR_EQUAL, 小于等于 EQUAL, 等于 NOT_EQUAL, 不等于 GREATER_OR_EQUAL, 大于等于 GREATER, 大于 NO_OP, 无操作在创建对象的第二个参数BinaryComparator是比较器,它是Hbase过滤器的核心部分组成之一,只要是处理一些比较逻辑,Hbase提供了很多比较器
RegexStringComparator 用于正则表达式比较 SubStringComparator 检查一个子串是否在该值中,不区分大小写 BinaryPrefixComparator 二进制前缀比较器,只比较前缀与BinaryComparator 相比 BinaryComparator 二进制比较器,用于按字典顺序比较 Byte 数据值 LongComparator long类型的比较 CellComparator列值过滤器,只过滤列,如下图所示,只保留age列
列族过滤器,过滤列族 下面过滤掉其他列族,只保留列族info1 FamilyFilter f1 = new FamilyFilter(CompareFilter.CompareOp.EQUAL,new BinaryComparator(“info1”.getBytes())); scan.setFilter(f1);
列前缀过滤,包含某个前缀的所有列名 下面是查找所有的带有nam的列 ColumnPrefixFilter f1 = new ColumnPrefixFilter(“nam”.getBytes()); scan.setFilter(f1);
按照具体的值来筛选单元格的过滤器,这会把一行中值不能满足的单元格过滤掉, 如图所示,只要一行中列值未name1的
ValueFilter f1 = new ValueFilter(CompareFilter.CompareOp.EQUAL,new BinaryComparator(“name1”.getBytes()));
和ColumnPrefixFilter 差不多,只不过MultipleColumnPrefixFilter可以指定多个列名前缀
byte [][] prefixs = {“nam-prefix1”.getBytes(),“nam-prefix2”.getBytes()}; MultipleColumnPrefixFilter f1 = new MultipleColumnPrefixFilter(prefixs);
3.1.DependentColumnFilter 该过滤器尝试找到该列所在的每一行,并返回该行具有相同时间戳的全部键值对 DependentColumnFilter f1 = new DependentColumnFilter(“family1”,“qualifer1”)
用一列的值决定这一行的数据是否被过滤。
如果给定过滤的列有,那么 SingleColumnValueFilter f1 = new SingleColumnValueFilter(“info1”.getBytes(),“name”.getBytes(), CompareFilter.CompareOp.EQUAL,new BinaryComparator(“name3”.getBytes())); 对于匹配info1:name 的列来说,可以找某列的值为name3,那么值为name3的所在的行都将会匹配到, 此外由于f1.setFilterIfMissing(false) ,那么对于其他列族的行也都会被匹配到, setFilterIfMissing(true)默认为false 如果f1.setFilterIfMissing(true),那么只匹配到列族info1的,值为name3的行
该过滤器是随机选择一行的过滤器。参数 chance 是一个浮点值,介于 0.1 和 1.0 之间。chance值越大,随机选取的列越多 RandomRowFilter f1 = new RandomRowFilter(0.4f);
行键过滤器 下面的例子值得到行键r1的数据 RowFilter f1 = new RowFilter(CompareFilter.CompareOp.EQUAL,new BinaryComparator(“r1”.getBytes()));
常规的 Scan 包含 start-row 但不包含 stop-row,如果使用该过滤器便可以包含 stop-row InclusiveStopFilter filter = new InclusiveStopFilter(Bytes.toBytes(“stopRowKey”));
该过滤器只查询每个行键的第一个键值对,在统计计数的时候提高效率。(HBase-Coprocessor 做 RowCount 的时候可以提高效率) FirstKeyOnlyFilter filter = new FirstKeyOnlyFilter();
该过滤器可以进行高效的列名内部扫描(列名是已经按字典排序好的)HBase-0.9.2 版本引入该功能。 得到name列
只查询每行键值对中有 “键” 元数据信息,不显示值,可以提升扫描的效率 KeyOnlyFilter filter = new KeyOnlyFilter(); ColumnPaginationFilter 按列分页过滤器,针对列数量很多的情况使用。
FilterList 是过滤器链,如果你想同时使用多个上述的过滤器,那么你就必须要使用它了。 比如,我想要查询列face_time范围 可以使用如下语句 切记如果列值类型是long一定要使用比较器LongComparator否则一定不成功 对于FilterList.Operator,有两个枚举变量 MUST_PASS_ALL and 过滤器之间是且的关系 MUST_PASS_ONE or过滤器之间是或的关系