Hbase过滤器
1.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
旨在使用多种过滤器时可以同时实现过滤器的功能
使用条件:
- 列族和列名的正确性:
- 过滤器中指定的列族(
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 版本兼容性问题:
不同版本的 HBase 对过滤器的支持可能有所不同。如果使用了不兼容的过滤器或 API,可能会导致运行时错误。
报错示例:
java.lang.NoSuchMethodError: org.apache.hadoop.hbase.filter.FilterList.<init>(Lorg/apache/hadoop/hbase/filter/FilterList$Operator;Ljava/util/List;)V
除了上述过滤器之外,还有更多Hbase过滤器可以在不同场景下使用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!