HBase过滤器 #
一、过滤器概述 #
HBase过滤器用于在服务端过滤数据,减少网络传输,提高查询效率。
1.1 过滤器优势 #
text
过滤器优势
├── 服务端过滤
│ └── 减少网络传输
│
├── 提高查询效率
│ └── 只返回符合条件的数据
│
├── 灵活的过滤条件
│ └── 支持多种过滤类型
│
└── 可组合使用
└── 多个过滤器组合
1.2 过滤器语法 #
ruby
# Shell语法
scan '表名', {FILTER => "过滤器类型(比较运算符, 比较器)"}
# 示例
scan 'user', {FILTER => "RowFilter(=, 'binary:user001')"}
二、比较器 #
2.1 比较器类型 #
| 比较器 | 说明 | 示例 |
|---|---|---|
| binary | 二进制比较 | ‘binary:value’ |
| binaryprefix | 二进制前缀比较 | ‘binaryprefix:pre’ |
| regexstring | 正则表达式匹配 | ‘regexstring:pattern’ |
| substring | 子字符串匹配 | ‘substring:sub’ |
2.2 比较运算符 #
| 运算符 | 说明 |
|---|---|
| = | 等于 |
| != | 不等于 |
| > | 大于 |
| >= | 大于等于 |
| < | 小于 |
| <= | 小于等于 |
三、常用过滤器 #
3.1 RowFilter(行键过滤器) #
ruby
# 行键等于
scan 'user', {FILTER => "RowFilter(=, 'binary:user001')"}
# 行键前缀
scan 'user', {FILTER => "RowFilter(=, 'binaryprefix:user00')"}
# 行键正则
scan 'user', {FILTER => "RowFilter(=, 'regexstring:user00.*')"}
# 行键小于
scan 'user', {FILTER => "RowFilter(<, 'binary:user010')"}
3.2 PrefixFilter(前缀过滤器) #
ruby
# 前缀过滤(最常用)
scan 'user', {FILTER => "PrefixFilter('user00')"}
# 等同于
scan 'user', {STARTROW => 'user00', STOPROW => 'user01'}
3.3 ValueFilter(值过滤器) #
ruby
# 值等于
scan 'user', {FILTER => "ValueFilter(=, 'binary:张三')"}
# 值前缀
scan 'user', {FILTER => "ValueFilter(=, 'binaryprefix:张')"}
# 值正则
scan 'user', {FILTER => "ValueFilter(=, 'regexstring:张.*')"}
# 值包含
scan 'user', {FILTER => "ValueFilter(=, 'substring:张')"}
3.4 QualifierFilter(列限定符过滤器) #
ruby
# 列名等于
scan 'user', {FILTER => "QualifierFilter(=, 'binary:name')"}
# 列名前缀
scan 'user', {FILTER => "QualifierFilter(=, 'binaryprefix:na')"}
# 列名正则
scan 'user', {FILTER => "QualifierFilter(=, 'regexstring:na.*')"}
3.5 FamilyFilter(列族过滤器) #
ruby
# 列族等于
scan 'user', {FILTER => "FamilyFilter(=, 'binary:info')"}
# 列族前缀
scan 'user', {FILTER => "FamilyFilter(=, 'binaryprefix:in')"}
3.6 SingleColumnValueFilter(单列值过滤器) #
ruby
# 基本语法
SingleColumnValueFilter('列族', '列限定符', 比较运算符, 比较器)
# 值等于
scan 'user', {FILTER => "SingleColumnValueFilter('info', 'age', =, 'binary:25')"}
# 值大于
scan 'user', {FILTER => "SingleColumnValueFilter('info', 'age', >, 'binary:20')"}
# 值范围
scan 'user', {FILTER => "SingleColumnValueFilter('info', 'age', >=, 'binary:20') AND SingleColumnValueFilter('info', 'age', <=, 'binary:30')"}
# 如果列不存在也返回
scan 'user', {FILTER => "SingleColumnValueFilter('info', 'age', =, 'binary:25', true, true)"}
3.7 SingleColumnValueExcludeFilter #
ruby
# 过滤并排除该列
scan 'user', {FILTER => "SingleColumnValueExcludeFilter('info', 'age', >, 'binary:20')"}
3.8 ColumnPrefixFilter(列前缀过滤器) #
ruby
# 列前缀过滤
scan 'user', {FILTER => "ColumnPrefixFilter('na')"}
# 多列前缀过滤
scan 'user', {FILTER => "MultipleColumnPrefixFilter('na', 'ag')"}
3.9 PageFilter(分页过滤器) #
ruby
# 分页查询
scan 'user', {FILTER => "PageFilter(10)"}
# 分页查询下一页
scan 'user', {STARTROW => 'user010', FILTER => "PageFilter(10)"}
3.10 KeyOnlyFilter(只返回行键) #
ruby
# 只返回行键,不返回值
scan 'user', {FILTER => "KeyOnlyFilter()"}
3.11 FirstKeyOnlyFilter(只返回第一列) #
ruby
# 每行只返回第一列
scan 'user', {FILTER => "FirstKeyOnlyFilter()"}
3.12 TimestampsFilter(时间戳过滤器) #
ruby
# 指定时间戳
scan 'user', {FILTER => "TimestampsFilter(1704067200000, 1704067300000)"}
3.13 ColumnCountGetFilter(列数限制) #
ruby
# 限制返回列数
get 'user', 'user001', {FILTER => "ColumnCountGetFilter(5)"}
3.14 ColumnPaginationFilter(列分页) #
ruby
# 列分页,跳过前5列,返回10列
scan 'user', {FILTER => "ColumnPaginationFilter(10, 5)"}
四、过滤器组合 #
4.1 FilterList #
ruby
# AND组合
scan 'user', {FILTER => "FilterList(MUST_PASS_ALL,
RowFilter(=, 'binaryprefix:user00'),
ValueFilter(=, 'binary:张三'))"}
# OR组合
scan 'user', {FILTER => "FilterList(MUST_PASS_ONE,
ValueFilter(=, 'binary:张三'),
ValueFilter(=, 'binary:李四'))"}
4.2 运算符组合 #
ruby
# AND组合
scan 'user', {FILTER => "RowFilter(=, 'binaryprefix:user00') AND ValueFilter(=, 'binary:张三')"}
# OR组合
scan 'user', {FILTER => "ValueFilter(=, 'binary:张三') OR ValueFilter(=, 'binary:李四')"}
# NOT组合
scan 'user', {FILTER => "NOT ValueFilter(=, 'binary:张三')"}
# 复杂组合
scan 'user', {FILTER => "(RowFilter(=, 'binaryprefix:user00') AND ValueFilter(=, 'binary:张三')) OR ValueFilter(=, 'binary:李四')"}
五、Java API过滤器 #
5.1 基本使用 #
java
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.*;
import org.apache.hadoop.hbase.util.Bytes;
public class FilterExample {
public static void main(String[] args) throws Exception {
Connection connection = ConnectionFactory.createConnection();
Table table = connection.getTable(TableName.valueOf("user"));
// 创建Scan对象
Scan scan = new Scan();
// 创建过滤器
Filter filter = new PrefixFilter(Bytes.toBytes("user00"));
// 设置过滤器
scan.setFilter(filter);
// 执行扫描
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
String rowKey = Bytes.toString(result.getRow());
System.out.println("RowKey: " + rowKey);
}
scanner.close();
table.close();
connection.close();
}
}
5.2 SingleColumnValueFilter #
java
// 创建单列值过滤器
SingleColumnValueFilter filter = new SingleColumnValueFilter(
Bytes.toBytes("info"), // 列族
Bytes.toBytes("age"), // 列限定符
CompareOperator.GREATER, // 比较运算符
Bytes.toBytes("20") // 比较值
);
// 设置过滤器
Scan scan = new Scan();
scan.setFilter(filter);
5.3 FilterList组合 #
java
// 创建过滤器列表
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
// 添加过滤器
filterList.addFilter(new PrefixFilter(Bytes.toBytes("user00")));
filterList.addFilter(new SingleColumnValueFilter(
Bytes.toBytes("info"),
Bytes.toBytes("age"),
CompareOperator.GREATER,
Bytes.toBytes("20")
));
// 设置过滤器
Scan scan = new Scan();
scan.setFilter(filterList);
六、自定义过滤器 #
6.1 自定义过滤器类 #
java
import org.apache.hadoop.hbase.filter.FilterBase;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
public class CustomFilter extends FilterBase {
private byte[] value;
private boolean filterRow = false;
public CustomFilter(byte[] value) {
this.value = value;
}
@Override
public ReturnCode filterCell(Cell cell) throws IOException {
byte[] cellValue = CellUtil.cloneValue(cell);
if (Bytes.compareTo(cellValue, value) == 0) {
filterRow = true;
return ReturnCode.INCLUDE;
}
return ReturnCode.INCLUDE;
}
@Override
public boolean filterRow() throws IOException {
return filterRow;
}
@Override
public void reset() throws IOException {
filterRow = false;
}
}
6.2 注册自定义过滤器 #
xml
<!-- hbase-site.xml -->
<property>
<name>hbase.regionserver.custom.filter.classes</name>
<value>com.example.CustomFilter</value>
</property>
七、过滤器性能 #
7.1 过滤器执行位置 #
text
过滤器执行位置
├── 客户端
│ └── 过滤器解析和序列化
│
├── RegionServer
│ ├── 读取数据时过滤
│ └── 减少网络传输
│
└── StoreFile
├── Bloom Filter快速过滤
└── 减少磁盘IO
7.2 性能优化建议 #
text
性能优化建议
├── 使用布隆过滤器
│ └── 快速判断RowKey是否存在
│
├── 合理设计RowKey
│ └── 支持范围查询
│
├── 使用范围限制
│ └── STARTROW/STOPROW
│
├── 避免全表扫描
│ └── 使用过滤器限制范围
│
└── 选择合适的过滤器
└── PrefixFilter比RowFilter效率高
八、过滤器示例 #
8.1 用户查询示例 #
ruby
# 查询user00开头的用户
scan 'user', {FILTER => "PrefixFilter('user00')"}
# 查询年龄大于20的用户
scan 'user', {FILTER => "SingleColumnValueFilter('info', 'age', >, 'binary:20')"}
# 查询姓名包含"张"的用户
scan 'user', {FILTER => "SingleColumnValueFilter('info', 'name', =, 'substring:张')"}
# 组合查询
scan 'user', {FILTER => "PrefixFilter('user00') AND SingleColumnValueFilter('info', 'age', >, 'binary:20')"}
8.2 订单查询示例 #
ruby
# 查询已支付订单
scan 'order', {FILTER => "SingleColumnValueFilter('detail', 'status', =, 'binary:paid')"}
# 查询金额大于100的订单
scan 'order', {FILTER => "SingleColumnValueFilter('detail', 'amount', >, 'binary:100')"}
# 查询用户订单
scan 'order', {FILTER => "PrefixFilter('user001_')"}
8.3 日志查询示例 #
ruby
# 查询特定设备日志
scan 'log', {FILTER => "PrefixFilter('device001_')"}
# 查询特定级别日志
scan 'log', {FILTER => "SingleColumnValueFilter('data', 'level', =, 'binary:ERROR')"}
# 分页查询
scan 'log', {FILTER => "PageFilter(100)"}
九、总结 #
本节介绍了HBase过滤器:
| 过滤器 | 用途 |
|---|---|
| RowFilter | 行键过滤 |
| PrefixFilter | 前缀过滤 |
| ValueFilter | 值过滤 |
| QualifierFilter | 列名过滤 |
| SingleColumnValueFilter | 单列值过滤 |
| PageFilter | 分页过滤 |
| FilterList | 过滤器组合 |
下一步,让我们学习协处理器!
最后更新:2026-03-27