找回密码
 立即注册
首页 业界区 安全 Hbase过滤器

Hbase过滤器

袁曼妮 2025-6-1 21:27:08
Hbase过滤器

Hbase中有很多过滤器和比较器:
HBase 的基本 API,包括增、删、改、查等。
增、删都是相对简单的操作,与传统的 RDBMS 相比,这里的查询操作略显苍白,只能根据特性的行键进行查询(Get)或者根据行键的范围来查询(Scan)。
HBase 不仅提供了这些简单的查询,而且提供了更加高级的过滤器(Filter)来查询。
过滤器可以根据列族、列、版本等更多的条件来对数据进行过滤,基于 HBase 本身提供的三维有序(行键,列,版本有序),这些过滤器可以高效地完成查询过滤的任务,带有过滤器条件的 RPC 查询请求会把过滤器分发到各个 RegionServer(这是一个服务端过滤器),这样也可以降低网络传输的压力。
使用过滤器至少需要两类参数:
一类是抽象的操作符,另一类是比较器
  1. 比较器:
  2. LESS  <
  3. LESS_OR_EQUAL <=
  4. EQUAL =
  5. NOT_EQUAL <>
  6. GREATER_OR_EQUAL >=
  7. GREATER >
  8. NO_OP 排除所有
  9. BinaryComparator
  10. > 按字节索引顺序比较指定字节数组,采用Bytes.compareTo(byte[])
  11. BinaryPrefixComparator
  12. > 通BinaryComparator,只是比较左端前缀的数据是否相同
  13. NullComparator
  14. > 判断给定的是否为空
  15. BitComparator
  16. > 按位比较
  17. RegexStringComparator
  18. > 提供一个正则的比较器,仅支持 EQUAL 和非EQUAL
  19. SubstringComparator
  20. > 判断提供的子串是否出现在中
复制代码
行键过滤器
  1. //RowFilter  行键过滤器(针对行键进行比较
  2. public static void fun1() throws Exception{
  3.         Scan scan = new Scan();
  4.         BinaryComparator binaryComparator = new BinaryComparator("1500101000".getBytes());
  5.    
  6.    
  7.         //其中EQUAL意为等值
  8.         RowFilter rowFilter = new RowFilter(CompareOperator.EQUAL,binaryComparator);
  9.         scan.setFilter(rowFilter);
  10.         ResultScanner scanner = students.getScanner(scan);
  11.         HBaseTool.printMoreData(scanner);
  12.     }
  13. //查询出行键为1500101000的值
复制代码
列簇过滤器
  1. //FamilyFilter  列簇过滤器(通过利用比较器SubstringComparator对列簇中是否包含某个字符串进行比较
  2. public static void fun2() throws Exception{
  3.         Scan scan = new Scan();
  4.            
  5.             //查询列簇中包含ra的值
  6.         SubstringComparator ra = new SubstringComparator("ra");
  7.         FamilyFilter familyFilter = new FamilyFilter(CompareOperator.EQUAL, ra);
  8.         scan.setFilter(familyFilter);
  9.         ResultScanner scanner = students.getScanner(scan);
  10.         HBaseTool.printMoreData(scanner);
  11.     }
复制代码
列名过滤器
  1. //QualifierFilter  列名过滤器(通过利用SubstringComparator对列名是否包含某个字符串进行比较
  2. public static void fun3() throws Exception{
  3.         Scan scan = new Scan();
  4.                 //查询列名中包含me的值
  5.         SubstringComparator fo = new SubstringComparator("me");
  6.         QualifierFilter qualifierFilter = new QualifierFilter(CompareOperator.EQUAL, fo);
  7.         scan.setFilter(qualifierFilter);
  8.         ResultScanner scanner = students.getScanner(scan);
  9.         HBaseTool.printMoreData(scanner);
  10.     }
复制代码
列值过滤器
  1. //ValueFilter  列值过滤器(通过利用BinaryPrefixComparator过滤出所有列中包含某一字符串为前缀开头的一列,其他列不会返回
  2. public static void fun4() throws Exception{
  3.         Scan scan = new Scan();
  4.                 //查询列值中以6开头的值
  5.         BinaryPrefixComparator binaryPrefixComparator = new BinaryPrefixComparator("6".getBytes());
  6.         ValueFilter valueFilter = new ValueFilter(CompareOperator.EQUAL, binaryPrefixComparator);
  7.         scan.setFilter(valueFilter);
  8.         ResultScanner scanner = students.getScanner(scan);
  9.         HBaseTool.printMoreData(scanner);
  10.     }
复制代码
单列值过滤器
  1. //SingleColumnValueFilter  单列值过滤器(SingleColumnValueFilter会返回满足条件的cell所在行的所有cell的值(即会返回一行数据)通过SingleColumnValueFilter与查询姓张的所有学生信息
  2. public static void fun5() throws Exception{
  3.         Scan scan = new Scan();
  4.         //创建单列值过滤器
  5.         //public SingleColumnValueFilter(byte[] family, byte[] qualifier, CompareOperator op, ByteArrayComparable comparator)
  6.         BinaryPrefixComparator binaryPrefixComparator = new BinaryPrefixComparator(Bytes.toBytes("张"));
  7.         SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(
  8.                 Bytes.toBytes("info"),
  9.                 Bytes.toBytes("name"),
  10.                 CompareOperator.EQUAL,
  11.                 binaryPrefixComparator);
  12.         scan.setFilter(singleColumnValueFilter);
  13.         ResultScanner resultScanner = students.getScanner(scan);
  14.         HBaseTool.printMoreData(resultScanner);
  15.     }
复制代码
单列值排除过滤器
  1. //列值排除过滤器:SingleColumnValueExcludeFilter
  2. //与SingleColumnValueFilter相反,会排除掉指定的列,其他的列全部返回
  3. //通过SingleColumnValueExcludeFilterBinaryComparator查询姓张的所有学生信息,最终不返回name列
  4. public static void fun6() throws Exception{
  5.         Scan scan = new Scan();
  6.         //创建单列值排除过滤器
  7.         SingleColumnValueExcludeFilter singleColumnValueExcludeFilter = new SingleColumnValueExcludeFilter(
  8.                 Bytes.toBytes("info"),
  9.                 Bytes.toBytes("name"),
  10.                 CompareOperator.EQUAL,
  11.                 new BinaryPrefixComparator(Bytes.toBytes("张"))
  12.         );
  13.         scan.setFilter(singleColumnValueExcludeFilter);
  14.         ResultScanner resultScanner = students.getScanner(scan);
  15.         HBaseTool.printMoreData(resultScanner);
  16.     }
复制代码
过滤器列表FilterList

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

  • 列族和列名的正确性

    • 过滤器中指定的列族(column family)和列名(column qualifier)必须存在于目标表中。
    • 如果列族或列名不存在,可能会导致过滤器失效或报错。

  • 数据类型的匹配

    • 过滤器中使用的值(value)必须与目标列的数据类型匹配。例如,如果列存储的是二进制数据,需要使用 Bytes.toBytes() 进行转换。

  • 性能优化

    • FilterList 中的过滤器数量不宜过多,否则可能会影响查询性能。
    • 尽量将过滤范围小的过滤器放在前面,以减少扫描的数据量。

  1. public static void fun7() throws Exception{
  2.     Scan scan = new Scan();
  3.             //创建单列值过滤器
  4.             //public SingleColumnValueFilter(byte[] family, byte[] qualifier, CompareOperator op, ByteArrayComparable comparator)
  5.             BinaryComparator binaryComparator = new BinaryComparator(Bytes.toBytes("理科一班"));
  6.             SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(
  7.                     Bytes.toBytes("info"),
  8.                     Bytes.toBytes("clazz"),
  9.                     CompareOperator.EQUAL,
  10.                     binaryComparator);
  11.             //创建单列值过滤器
  12.             //public SingleColumnValueFilter(byte[] family, byte[] qualifier, CompareOperator op, ByteArrayComparable comparator)
  13.             BinaryComparator binaryComparator2 = new BinaryComparator(Bytes.toBytes("22"));
  14.             SingleColumnValueFilter singleColumnValueFilter2 = new SingleColumnValueFilter(
  15.                     Bytes.toBytes("info"),
  16.                     Bytes.toBytes("age"),
  17.                     CompareOperator.GREATER,
  18.                     binaryComparator2);
  19.             //创建单列值过滤器
  20.             //public SingleColumnValueFilter(byte[] family, byte[] qualifier, CompareOperator op, ByteArrayComparable comparator)
  21.             BinaryComparator binaryComparator3 = new BinaryComparator(Bytes.toBytes("女"));
  22.             SingleColumnValueFilter singleColumnValueFilter3 = new SingleColumnValueFilter(
  23.                     Bytes.toBytes("info"),
  24.                     Bytes.toBytes("gender"),
  25.                     CompareOperator.EQUAL,
  26.                     binaryComparator3);
  27.             FilterList filterList = new FilterList();
  28.             filterList.addFilter(singleColumnValueFilter);
  29.             filterList.addFilter(singleColumnValueFilter2);
  30.             filterList.addFilter(singleColumnValueFilter3);
  31.             scan.setFilter(filterList);
  32.             ResultScanner resultScanner = students.getScanner(scan);
  33.             HBaseTool.printMoreData(resultScanner);
  34. }
复制代码
过滤器列表的常见报错


  • 列族或列名不存在


  • 如果过滤器中指定的列族或列名在表中不存在,HBase 会忽略该过滤器或抛出异常。
  • 报错示例:
    1. org.apache.hadoop.hbase.UnknownColumnFamilyException: Column family 'cf' does not exist
    复制代码

  • 数据类型不匹配


  • 如果过滤器中使用的值与列的数据类型不匹配,可能会导致过滤器失效或抛出异常。
  • 报错示例:
    1. java.lang.IllegalArgumentException: Invalid filter value type
    复制代码

  • 过滤器组合逻辑错误


  • 如果 FilterList 中的过滤器组合逻辑不合理(例如,MUST_PASS_ALL 条件下过滤器互相矛盾),可能会导致查询结果为空或不符合预期。

  • 过滤器数量过多


  • 如果 FilterList 中包含过多的过滤器,可能会导致查询性能下降,甚至触发 HBase 的扫描超时或内存溢出。
  • 报错示例:
    1. org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed after attempts=10
    复制代码

  • 过滤器实现错误


  • 如果自定义过滤器实现有误(例如,未正确实现 filterKeyValue 方法),可能会导致查询失败。
  • 报错示例:
    1. java.lang.NullPointerException: Filter implementation returned null
    复制代码

  • HBase 版本兼容性问题


  • 不同版本的 HBase 对过滤器的支持可能有所不同。如果使用了不兼容的过滤器或 API,可能会导致运行时错误。
  • 报错示例:
    1. java.lang.NoSuchMethodError: org.apache.hadoop.hbase.filter.FilterList.<init>(Lorg/apache/hadoop/hbase/filter/FilterList$Operator;Ljava/util/List;)V
    复制代码
除了上述过滤器之外,还有更多Hbase过滤器可以在不同场景下使用。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册