• Hbase过滤器小结


    过滤器
    HBase 的基本 API,包括增、删、改、查等。
    增、删都是相对简单的操作,与传统的 RDBMS 相比,这里的查询操作略显苍白,只能根据特性的行键进行查询(Get)或者根据行键的范围来查询(Scan)。
    HBase 不仅提供了这些简单的查询,而且提供了更加高级的过滤器(Filter)来查询。

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

    1.1.1 一类是抽象的操作符
    HBase 提供了枚举类型的变量来表示这些抽象的操作符:
    LESS
    LESS_OR_EQUAL
    EQUAL
    NOT_EQUAL
    GREATER_OR_EQUAL
    GREATER
    NO_OP

    1.1.2 另一类是比较器
    代表具体的逻辑,例如字节级的比较,字符串级的比较等。

    1.2 比较器
    比较器作为过滤器的核心组成之一,用于处理具体的比较逻辑,例如字节级的比较,字符串级的比较等。

    1.2.1 RegexStringComparator
    支持正则表达式的值比较

    Scan scan = new Scan();
    RegexStringComparator comp = new RegexStringComparator(“you.”); // 以 you 开头的字符串
    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes(“family”), Bytes.toBytes(“qualifier”), CompareOp.EQUAL, comp);
    scan.setFilter(filter);

    1.2.2 SubStringComparator
    用于监测一个子串是否存在于值中,并且不区分大小写。

    Scan scan = new Scan();
    SubstringComparator comp = new SubstringComparator(“1129”); // 查找包含 1129 的字符串
    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes(“family”), Bytes.toBytes(“qualifier”), CompareOp.EQUAL, comp);
    scan.setFilter(filter);

    1.2.3 BinaryPrefixComparator
    前缀二进制比较器。与二进制比较器不同的是,只比较前缀是否相同。

    Scan scan = new Scan();
    BinaryPrefixComparator comp = new BinaryPrefixComparator(Bytes.toBytes(“yting”)); //
    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes(“family”), Bytes.toBytes(“qualifier”), CompareOp.EQUAL, comp);
    scan.setFilter(filter);

    1.2.4 BinaryComparator
    二进制比较器,用于按字典顺序比较 Byte 数据值。
    Scan scan = new Scan();
    BinaryComparator comp = new BinaryComparator(Bytes.toBytes(“xmei”)); //
    ValueFilter filter = new ValueFilter(CompareOp.EQUAL, comp);
    scan.setFilter(filter);

    1.3 列值过滤器
    1.3.1 SingleColumnValueFilter
    SingleColumnValueFilter 用于测试值的情况(相等,不等,范围 、、、)

    下面一个检测列族 family 下的列 qualifier 的列值和字符串 “my-value” 相等的部分示例代码 :
    Scan scan = new Scan();

    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes(“family”), Bytes.toBytes(“qualifier”), CompareOp.EQUAL, Bytes.toBytes(“my-value”));
    scan.setFilter(filter);

    1.3.2 SingleColumnValueExcludeFilter
    跟 SingleColumnValueFilter 功能一样,只是不查询出该列的值。

    下面的代码就不会查询出 family 列族下 qualifier 列的值(列都不会查出来)
    Scan scan = new Scan();
    SingleColumnValueExcludeFilter filter = new SingleColumnValueExcludeFilter(Bytes.toBytes(“family”), Bytes.toBytes(“qualifier”), CompareOp.EQUAL, Bytes.toBytes(“my-value”));
    scan.setFilter(filter);

    1.4 键值元数据过滤器
    HBase 采用 “键值对” 保存内部数据,键值元数据过滤器评估一行的 “键” 是否保存在(如 ColumnFamily:Column qualifiers)。

    1.4.1 FamilyFilter
    用于过滤列族(通常在 Scan 过程中通过设定某些列族来实现该功能,而不是直接使用该过滤器)。

    Scan scan = new Scan();
    FamilyFilter filter = new FamilyFilter(CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes(“my-family”))); // 列族为 my-family
    scan.setFilter(filter);

    1.4.2 QualifierFilter
    用于列名(Qualifier)过滤。

    Scan scan = new Scan();
    QualifierFilter filter = new QualifierFilter(CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes(“my-column”))); // 列名为 my-column
    scan.setFilter(filter);

    1.4.3 ColumnPrefixFilter
    用于列名(Qualifier)前缀过滤,即包含某个前缀的所有列名。

    Scan scan = new Scan();
    ColumnPrefixFilter filter = new ColumnPrefixFilter(Bytes.toBytes(“my-prefix”)); // 前缀为 my-prefix
    scan.setFilter(filter);

    1.4.4 MultipleColumnPrefixFilter
    MultipleColumnPrefixFilter 与 ColumnPrefixFilter 的行为类似,但可以指定多个列名(Qualifier)前缀。

    Scan scan = new Scan();
    byte[][] prefixes = new byte[][]{Bytes.toBytes(“my-prefix-1”), Bytes.toBytes(“my-prefix-2”)};
    MultipleColumnPrefixFilter filter = new MultipleColumnPrefixFilter(prefixes); // 不解释,你懂的 、、、
    scan.setFilter(filter);

    1.4.5 ColumnRangeFilter
    该过滤器可以进行高效的列名内部扫描。(为何是高效呢???因为列名是已经按字典排序好的)HBase-0.9.2 版本引入该功能。

    Scan scan = new Scan();
    boolean minColumnInclusive = true;
    boolean maxColumnInclusive = true;
    ColumnRangeFilter filter = new ColumnRangeFilter(Bytes.toBytes(“minColumn”), minColumnInclusive, Bytes.toBytes(“maxColumn”), maxColumnInclusive);
    scan.setFilter(filter);

    1.4.6 DependentColumnFilter
    该过滤器尝试找到该列所在的每一行,并返回该行具有相同时间戳的全部键值对。

    Scan scan = new Scan();
    DependentColumnFilter filter = new DependentColumnFilter(Bytes.toBytes(“family”), Bytes.toBytes(“qualifier”));
    scan.setFilter(filter);

    1.5 行键过滤器
    1.5.1 RowFilter
    行键过滤器,一般来讲,执行 Scan 使用 startRow/stopRow 方式比较好,而 RowFilter 过滤器也可以完成对某一行的过滤。

    Scan scan = new Scan();
    RowFilter filter = new RowFilter(CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes(“my-row-1”)));
    scan.setFilter(filter);
    ————————————————
    版权声明:本文为CSDN博主「qq_40178533」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_40178533/article/details/106562563

  • 相关阅读:
    2019-09-29-阿里三面
    【Layui】在前端提交表单时验证密码是否正确
    【Mivik 的字符串公开赛A】大佬语录(广义后缀自动机)
    【2020ICPC南京J】Just Another Game of Stones(Nim博弈+吉老师线段树)
    【HDU-6291/2018CCPC女生赛E】对称数(散列+树上主席树)
    【计蒜客42547/2019ICPC徐州H】Yuuki and a problem(MEX性质+树套树)
    【HDU-6230/2017CCPC哈尔滨A】Palindrome(式子转换+马拉车+主席树)
    【HDU-6223/2017ICPC沈阳G】Infinite Fraction Path(后缀数组+超级快读)
    【HDU-5785】Interesting(回文串的性质+回文自动机+map空间优化)
    【CF-1452E】Two Editorials (贪心)
  • 原文地址:https://www.cnblogs.com/it-deepinmind/p/14456854.html
Copyright © 2020-2023  润新知