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