Hbase知识点(五)HBase过滤器(Filter)

2019/09/05 发布  ·  次阅读  ·  本文 3347 字  ·  读完需要 10 分钟

HBase 的基本 API,提供了包括增、删、改、查等的操作。相对而言,与传统的关系型数据库相比,查询略显苍白。只能根据特性的行键进行查询(Get)或者根据行键的范围来查询(Scan)。 为此 HBase 提供了高级的查询方法:过滤器 Filter 。

过滤器(Filter)

过滤器可以根据列族、列、版本等更多的条件来对数据进行过滤,基于 HBase 本身提供的三维有序(行键,列,版本有序),这些过滤器可以高效地完成查询过滤的任务,带有过滤器条件的 RPC 查询请求会把过滤器分发到各个 RegionServer(这是一个服务端过滤器),这样也可以降低网络传输的压力。

过滤器的两类参数

完成一个过滤的操作,至少需要两个参数。分别为:抽象的操作符、比较器(Comparator)。 有了这两个参数,我们就可以清晰的定义筛选的条件,过滤数据。

抽象操作符(比较运算符)

HBase 提供了枚举类型的变量来表示这些抽象的操作符。

LESS < 小于
LESS_OR_EQUAL <= 小于等于
EQUAL = 等于
NOT_EQUAL <> 非等
GREATER_OR_EQUAL >= 大于等于
GREATER > 大于
NO_OP 排除所有

比较器(Comparator)

比较器(Comparator),代表具体的比较逻辑,可以为字节级的比较、字符串级的比较等。

  • BinaryComparator 按字节索引顺序比较指定字节数组,采用 Bytes.compareTo(byte[])
  • BinaryPrefixComparator 跟前面相同,只是比较左端的数据是否相同
  • NullComparator 判断给定的是否为空
  • BitComparator 按位比较
  • RegexStringComparator 提供一个正则的比较器,仅支持 EQUAL 和非 EQUAL
  • SubstringComparator 判断提供的子串是否出现在 value 中

HBase过滤器的分类

1、行键过滤器 RowFilter,筛选出匹配的所有的行。

Filter rowFilter = new RowFilter(CompareOp.GREATER, new BinaryComparator(Bytes.toBytes("row1")));
scan.setFilter(rowFilter);

2、列簇过滤器 FamilyFilter,筛选出匹配的列簇。

Filter familyFilter = new FamilyFilter(CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("cf1")));
scan.setFilter(familyFilter);

3、列过滤器 QualifierFilte,筛选出匹配的列。

Filter qualifierFilter = new QualifierFilter(CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("qualifier1")));
scan.setFilter(qualifierFilter);

4、值过滤器 ValueFilter,筛选出匹配的值。

Filter valueFilter = new ValueFilter(CompareOp.EQUAL, new SubstringComparator(value);
scan.setFilter(valueFilter);

5、时间戳过滤器 TimestampsFilter,

List<Long> list = new ArrayList<>();
list.add(1522469029503l);
TimestampsFilter timestampsFilter = new TimestampsFilter(list);
scan.setFilter(timestampsFilter);

6、FilterList:用于综合使用多个过滤器。其有两种关系:FilterList.Operator.MUST_PASS_ONE和FilterList.Operator.MUST_PASS_ALL,默认的是FilterList.Operator.MUST_PASS_ALL,顾名思义,它们分别是AND和OR的关系,并且FilterList可以嵌套使用FilterList,使我们能够表达更多的需求:

FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL); 
filterList.addFilter(new ColumnPrefixFilter(keyPrefix.getBytes()));
filterList.addFilter(new QualifierFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL,new BinaryComparator(Bytes.toBytes(cq1))));
scan.setFilter(filterList);

专用过滤器

1、单列值过滤器 SingleColumnValueFilter —-会返回满足条件的整行

SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(
                "info".getBytes(), //列簇
                "name".getBytes(), //列
                CompareOp.EQUAL, 
                new SubstringComparator("刘晨"));
//如果不设置为 true,则那些不包含指定 column 的行也会返回
singleColumnValueFilter.setFilterIfMissing(true);
scan.setFilter(singleColumnValueFilter);

2、单列值排除器 SingleColumnValueExcludeFilter

SingleColumnValueExcludeFilter singleColumnValueExcludeFilter = new SingleColumnValueExcludeFilter(
                "info".getBytes(), 
                "name".getBytes(), 
                CompareOp.EQUAL, 
                new SubstringComparator("刘晨"));
singleColumnValueExcludeFilter.setFilterIfMissing(true);
        
scan.setFilter(singleColumnValueExcludeFilter);

3、前缀过滤器 PrefixFilter—-针对行键

PrefixFilter prefixFilter = new PrefixFilter("9501".getBytes());
        
scan.setFilter(prefixFilter);

4、列前缀过滤器 ColumnPrefixFilter,包含某个前缀的所有列名

ColumnPrefixFilter columnPrefixFilter = new ColumnPrefixFilter(Bytes.toBytes("qualifier1"));
scan.setFilter(columnPrefixFilter);

5、列前缀过滤器 MultipleColumnPrefixFilter,包含指定多个列名(Qualifier)前缀

byte[][] prefixes = new byte[][]{Bytes.toBytes("qualifier1"), Bytes.toBytes("qualifier2")};
MultipleColumnPrefixFilter multipleColumnPrefixFilter = new MultipleColumnPrefixFilter(prefixes);
scan.setFilter(multipleColumnPrefixFilter);

6、分页过滤器 PageFilter 分页方案

自定义过滤器

继承 FilterBase,然后打成 jar 包放到 $HBASE_HOEM/lib 目录下去,重启 HBase 集群。

扫码关注有惊喜

(转载本站文章请注明作者和出处 白贺-studytime

Post Directory