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
旨在使用多种过滤器时可以同时实现过滤器的功能
使用条件:
- 列族和列名的正确性:
- 过滤器中指定的列族(column family)和列名(column qualifier)必须存在于目标表中。
- 如果列族或列名不存在,可能会导致过滤器失效或报错。
- 数据类型的匹配:
- 过滤器中使用的值(value)必须与目标列的数据类型匹配。例如,如果列存储的是二进制数据,需要使用 Bytes.toBytes() 进行转换。
- 性能优化:
- 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);
- }
复制代码 过滤器列表的常见报错
- 如果过滤器中指定的列族或列名在表中不存在,HBase 会忽略该过滤器或抛出异常。
- 报错示例:
- org.apache.hadoop.hbase.UnknownColumnFamilyException: Column family 'cf' does not exist
复制代码
- 如果过滤器中使用的值与列的数据类型不匹配,可能会导致过滤器失效或抛出异常。
- 报错示例:
- java.lang.IllegalArgumentException: Invalid filter value type
复制代码
- 如果 FilterList 中的过滤器组合逻辑不合理(例如,MUST_PASS_ALL 条件下过滤器互相矛盾),可能会导致查询结果为空或不符合预期。
- 如果 FilterList 中包含过多的过滤器,可能会导致查询性能下降,甚至触发 HBase 的扫描超时或内存溢出。
- 报错示例:
- org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed after attempts=10
复制代码
- 如果自定义过滤器实现有误(例如,未正确实现 filterKeyValue 方法),可能会导致查询失败。
- 报错示例:
- java.lang.NullPointerException: Filter implementation returned null
复制代码
- 不同版本的 HBase 对过滤器的支持可能有所不同。如果使用了不兼容的过滤器或 API,可能会导致运行时错误。
- 报错示例:
- java.lang.NoSuchMethodError: org.apache.hadoop.hbase.filter.FilterList.<init>(Lorg/apache/hadoop/hbase/filter/FilterList$Operator;Ljava/util/List;)V
复制代码
除了上述过滤器之外,还有更多Hbase过滤器可以在不同场景下使用。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |