Hbase过滤器

Hbase过滤器

Hbase中有很多过滤器和比较器:

HBase 的基本 API,包括增、删、改、查等。

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

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

使用过滤器至少需要两类参数:

一类是抽象的操作符,另一类是比较器

比较器:

LESS  <
LESS_OR_EQUAL <=
EQUAL =
NOT_EQUAL <>
GREATER_OR_EQUAL >=
GREATER >
NO_OP 排除所有

BinaryComparator

> 按字节索引顺序比较指定字节数组,采用Bytes.compareTo(byte[])


BinaryPrefixComparator

> 通BinaryComparator,只是比较左端前缀的数据是否相同


NullComparator

> 判断给定的是否为空


BitComparator

> 按位比较


RegexStringComparator

> 提供一个正则的比较器,仅支持 EQUAL 和非EQUAL


SubstringComparator

> 判断提供的子串是否出现在中

行键过滤器

//RowFilter  行键过滤器(针对行键进行比较

public static void fun1() throws Exception{

        Scan scan = new Scan();

        BinaryComparator binaryComparator = new BinaryComparator("1500101000".getBytes());
    
    
        //其中EQUAL意为等值
        RowFilter rowFilter = new RowFilter(CompareOperator.EQUAL,binaryComparator);

        scan.setFilter(rowFilter);

        ResultScanner scanner = students.getScanner(scan);

        HBaseTool.printMoreData(scanner);
    }
//查询出行键为1500101000的值

列簇过滤器

//FamilyFilter  列簇过滤器(通过利用比较器SubstringComparator对列簇中是否包含某个字符串进行比较

public static void fun2() throws Exception{

        Scan scan = new Scan();
    	
    	//查询列簇中包含ra的值
        SubstringComparator ra = new SubstringComparator("ra");

        FamilyFilter familyFilter = new FamilyFilter(CompareOperator.EQUAL, ra);

        scan.setFilter(familyFilter);

        ResultScanner scanner = students.getScanner(scan);

        HBaseTool.printMoreData(scanner);
    }

列名过滤器

//QualifierFilter  列名过滤器(通过利用SubstringComparator对列名是否包含某个字符串进行比较

public static void fun3() throws Exception{
        Scan scan = new Scan();
		//查询列名中包含me的值
        SubstringComparator fo = new SubstringComparator("me");

        QualifierFilter qualifierFilter = new QualifierFilter(CompareOperator.EQUAL, fo);

        scan.setFilter(qualifierFilter);

        ResultScanner scanner = students.getScanner(scan);

        HBaseTool.printMoreData(scanner);

    }

列值过滤器

//ValueFilter  列值过滤器(通过利用BinaryPrefixComparator过滤出所有列中包含某一字符串为前缀开头的一列,其他列不会返回

public static void fun4() throws Exception{

        Scan scan = new Scan();
		//查询列值中以6开头的值
        BinaryPrefixComparator binaryPrefixComparator = new BinaryPrefixComparator("6".getBytes());

        ValueFilter valueFilter = new ValueFilter(CompareOperator.EQUAL, binaryPrefixComparator);

        scan.setFilter(valueFilter);

        ResultScanner scanner = students.getScanner(scan);

        HBaseTool.printMoreData(scanner);

    }

单列值过滤器

//SingleColumnValueFilter  单列值过滤器(SingleColumnValueFilter会返回满足条件的cell所在行的所有cell的值(即会返回一行数据)通过SingleColumnValueFilter与查询姓张的所有学生信息

public static void fun5() throws Exception{
        Scan scan = new Scan();
        //创建单列值过滤器
        //public SingleColumnValueFilter(byte[] family, byte[] qualifier, CompareOperator op, ByteArrayComparable comparator)
        BinaryPrefixComparator binaryPrefixComparator = new BinaryPrefixComparator(Bytes.toBytes("张"));
        SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(
                Bytes.toBytes("info"),
                Bytes.toBytes("name"),
                CompareOperator.EQUAL,
                binaryPrefixComparator);

        scan.setFilter(singleColumnValueFilter);

        ResultScanner resultScanner = students.getScanner(scan);
        HBaseTool.printMoreData(resultScanner);
    }

单列值排除过滤器

//列值排除过滤器:SingleColumnValueExcludeFilter
//与SingleColumnValueFilter相反,会排除掉指定的列,其他的列全部返回
//通过SingleColumnValueExcludeFilterBinaryComparator查询姓张的所有学生信息,最终不返回name列

public static void fun6() throws Exception{
        Scan scan = new Scan();
        //创建单列值排除过滤器
        SingleColumnValueExcludeFilter singleColumnValueExcludeFilter = new SingleColumnValueExcludeFilter(
                Bytes.toBytes("info"),
                Bytes.toBytes("name"),
                CompareOperator.EQUAL,
                new BinaryPrefixComparator(Bytes.toBytes("张"))
        );

        scan.setFilter(singleColumnValueExcludeFilter);

        ResultScanner resultScanner = students.getScanner(scan);
        HBaseTool.printMoreData(resultScanner);
    }

过滤器列表FilterList

旨在使用多种过滤器时可以同时实现过滤器的功能

使用条件:

  1. 列族和列名的正确性
    • 过滤器中指定的列族(column family)和列名(column qualifier)必须存在于目标表中。
    • 如果列族或列名不存在,可能会导致过滤器失效或报错。
  2. 数据类型的匹配
    • 过滤器中使用的值(value)必须与目标列的数据类型匹配。例如,如果列存储的是二进制数据,需要使用 Bytes.toBytes() 进行转换。
  3. 性能优化
    • FilterList 中的过滤器数量不宜过多,否则可能会影响查询性能。
    • 尽量将过滤范围小的过滤器放在前面,以减少扫描的数据量。
public static void fun7() throws Exception{
    Scan scan = new Scan();
            //创建单列值过滤器
            //public SingleColumnValueFilter(byte[] family, byte[] qualifier, CompareOperator op, ByteArrayComparable comparator)
            BinaryComparator binaryComparator = new BinaryComparator(Bytes.toBytes("理科一班"));
            SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(
                    Bytes.toBytes("info"),
                    Bytes.toBytes("clazz"),
                    CompareOperator.EQUAL,
                    binaryComparator);

            //创建单列值过滤器
            //public SingleColumnValueFilter(byte[] family, byte[] qualifier, CompareOperator op, ByteArrayComparable comparator)
            BinaryComparator binaryComparator2 = new BinaryComparator(Bytes.toBytes("22"));
            SingleColumnValueFilter singleColumnValueFilter2 = new SingleColumnValueFilter(
                    Bytes.toBytes("info"),
                    Bytes.toBytes("age"),
                    CompareOperator.GREATER,
                    binaryComparator2);

            //创建单列值过滤器
            //public SingleColumnValueFilter(byte[] family, byte[] qualifier, CompareOperator op, ByteArrayComparable comparator)
            BinaryComparator binaryComparator3 = new BinaryComparator(Bytes.toBytes("女"));
            SingleColumnValueFilter singleColumnValueFilter3 = new SingleColumnValueFilter(
                    Bytes.toBytes("info"),
                    Bytes.toBytes("gender"),
                    CompareOperator.EQUAL,
                    binaryComparator3);

            FilterList filterList = new FilterList();
            filterList.addFilter(singleColumnValueFilter);
            filterList.addFilter(singleColumnValueFilter2);
            filterList.addFilter(singleColumnValueFilter3);

            scan.setFilter(filterList);


            ResultScanner resultScanner = students.getScanner(scan);
            HBaseTool.printMoreData(resultScanner);
}

过滤器列表的常见报错

  1. 列族或列名不存在
  • 如果过滤器中指定的列族或列名在表中不存在,HBase 会忽略该过滤器或抛出异常。

  • 报错示例:

    org.apache.hadoop.hbase.UnknownColumnFamilyException: Column family 'cf' does not exist
    
  1. 数据类型不匹配
  • 如果过滤器中使用的值与列的数据类型不匹配,可能会导致过滤器失效或抛出异常。

  • 报错示例:

    java.lang.IllegalArgumentException: Invalid filter value type
    
  1. 过滤器组合逻辑错误
  • 如果 FilterList 中的过滤器组合逻辑不合理(例如,MUST_PASS_ALL 条件下过滤器互相矛盾),可能会导致查询结果为空或不符合预期。
  1. 过滤器数量过多
  • 如果 FilterList 中包含过多的过滤器,可能会导致查询性能下降,甚至触发 HBase 的扫描超时或内存溢出。

  • 报错示例:

    org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed after attempts=10
    
  1. 过滤器实现错误
  • 如果自定义过滤器实现有误(例如,未正确实现 filterKeyValue 方法),可能会导致查询失败。

  • 报错示例:

    java.lang.NullPointerException: Filter implementation returned null
    
  1. HBase 版本兼容性问题
  • 不同版本的 HBase 对过滤器的支持可能有所不同。如果使用了不兼容的过滤器或 API,可能会导致运行时错误。

  • 报错示例:

    java.lang.NoSuchMethodError: org.apache.hadoop.hbase.filter.FilterList.<init>(Lorg/apache/hadoop/hbase/filter/FilterList$Operator;Ljava/util/List;)V
    

除了上述过滤器之外,还有更多Hbase过滤器可以在不同场景下使用。

posted @   Roxan  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示