HBase过滤器详解(附带实例)
HBase 过滤器用于条件查询,这个功能类似于 SQL 语句中的 where 语句。在使用 get/scan 命令查询数据时,可以使用过滤器限定输出范围。
查看当前 HBase 支持的过滤器可以使用 show_filters 命令,所得到的结果如下:
这里的比较运算符与比较器如下图所示:

图 1 比较运算符与比较器
下面介绍几种常见的过滤器,实例中会以下表展示的学生信息(Student)为例:
配合 SubstringComparator 比较器过滤出行键以 001 开头的数据,具体操作如下。但是,该比较器不支持大于(>)和小于(<)比较运算符。
过滤器还可以这样使用,具体如下:
HBase 其他的行键过滤器如下表所示:
例如,查询 Student 表中 StuInfo 列(族)的所有行数据,具体操作如下:
其他的列(族)过滤器如下表所示:
查看当前 HBase 支持的过滤器可以使用 show_filters 命令,所得到的结果如下:
hbase(main):007:0* show_filters DependentColumnFilter KeyOnlyFilter ColumnCountGetFilter SingleColumnValueFilter PrefixFilter SingleColumnValueExcludeFilter FirstKeyOnlyFilter ColumnRangeFilter过滤器的使用格式如下:
scan 'Student',{FILTER => "过滤器(比较运算符,’比较器’)"}在上述格式中:
- 使用 FILTER => 指明过滤方法,所属语句整体使用大括号,也可以不使用大括号;
- 过滤器使用双引号;
- 比较器使用单引号。
这里的比较运算符与比较器如下图所示:

图 1 比较运算符与比较器
下面介绍几种常见的过滤器,实例中会以下表展示的学生信息(Student)为例:

HBase RowFilter行键过滤器
RowFilter 行键过滤器可以配合比较器来实现行键字符串的过滤,如配合 BinaryComparator 比较器过滤出行键大于 001 的数据,具体代码如下:hbase(main):007:0> scan 'Student',{FILTER => "RowFilter(>,'binary:001')"} ROW COLUMN + CELL 002 column = StuInfo:Name, timestamp = 1630073033269, value = Lucy 1 row(s) in 0.0070 seconds
配合 SubstringComparator 比较器过滤出行键以 001 开头的数据,具体操作如下。但是,该比较器不支持大于(>)和小于(<)比较运算符。
hbase(main):008:0> scan 'Student',{FILTER => "RowFilter( = ,'substring:001')"} ROW COLUMN + CELL 001 column = Grades:BigData, timestamp = 1630071771468, value = 90 001 column = Grades:Computer, timestamp = 1630071781218, value = 85 001 column = Grades:Math, timestamp = 1630071788138, value = 70 001 column = StuInfo:Age, timestamp = 1630071738515, value = 20 001 column = StuInfo:Name, timestamp = 1630072022705, value = Tom 001 column = StuInfo:Sex, timestamp = 1630071747571, value = Male 1 row(s) in 0.0220 seconds
过滤器还可以这样使用,具体如下:
hbase(main):008:0> scan 'Student ' ,FILTER=>"RowFilter(>, ' binary:001' )" ROW COLUMN + CELL 002 column = StuInfo:Age,timestamp = 1627226994232,value=28 002 column = StuInfo:Name,timestamp = 1627226963024,value = Jack 1 row(s) in 0.6690 seconds hbase(main):008:0> scan 'Student ' ,FILTER => "RowFilter( =, ' substring:001' ) " ROW COLUMN + CELL 001 column = Grades:Math, timestamp = 1627224477893, value=70 001 column = Grades:Math, timestamp = 1627224477893, value=70 001 column = StuInfo:Name,timestamp = 1627223409989,value=Jack 001 column = StuInfo:Name,timestamp = 1627223409989,value=Jack 001 column = StuInfo:Sex,timestamp = 1627224411413,value=Male 1 row(s) in 0.1480 seconds
HBase 其他的行键过滤器如下表所示:
行键过滤器 | 功能描述 | 使用示例 |
---|---|---|
PrefixFilter | 前缀过滤器,比较行键的前缀 |
scan 'Student', FILTER => "PrefixFilter('001')" 作用等同于 scan 'Student', FILTER => "RowFilter(=, 'substring:001')" |
KeyOnlyFilter | 只显示列名,不显示具体的值 | scan 'Student', FILTER => "KeyOnlyFilter()" |
FirstKeyOnlyFilter | 只显示列族中第一列的单元格值 | scan 'Student', FILTER => "FirstKeyOnlyFilter()" |
InclusiveStopFilter | 作用等同于 ENDROW,二者的区别在于本过滤器会返回结束行 |
scan 'Student', {STARTROW => '001', FILTER => "InclusiveStopFilter('binary:002')"} 作用等同于 scan 'Student', {STARTROW => '001', ENDROW => '003'} |
HBase FamilyFilter列(族)过滤器
列(族)过滤器使用 FamilyFilter,其语法格式与 RowFilter 类似,查询指定列(族)的数据。例如,查询 Student 表中 StuInfo 列(族)的所有行数据,具体操作如下:
hbase(main):009:0> scan 'Student',FILTER = >"FamilyFilter( = ,'substring:StuInfo')" ROW COLUMN + CELL 001 column = StuInfo:Age, timestamp = 1630071738515, value=20 001 column = StuInfo:Name, timestamp = 1630072022705, value=Tom 001 column = StuInfo:Sex, timestamp = 1630071747571, value=Male 002 column = StuInfo:Name, timestamp = 1630073033269, value=Lucy 2 row(s) in 0.0210 seconds
其他的列(族)过滤器如下表所示:
列过滤器 | 功能描述 | 使用示例 |
---|---|---|
QualifierFilter | 列标识过滤器,只显示对应列的数据 | scan 'Student', FILTER => "QualifierFilter(=,'substring:Com')" |
ColumnPrefixFilter | 列名前缀过滤器 | scan 'Student', FILTER => "ColumnPrefixFilter('Com')" |
MultipleColumnPrefixFilter | 使用多个前缀对列过滤 | scan 'Student', FILTER => "MultipleColumnPrefixFilter('Com','Math')" |
ColumnRangeFilter | 列名范围过滤器,指明起始列、终止列使用 true/false 表示是否包含该列 | scan 'Student', FILTER => "ColumnRangeFilter('Big', true,'Math', false)" |
HBase值过滤器
值过滤器针对 HBase 数据表中单元格的数据进行过滤。值过滤器如下表所示:值过滤器 | 功能描述 | 使用示例 |
---|---|---|
ValueFilter | 值过滤器,找到符合值条件的键值对 | scan 'Student', FILTER => "ValueFilter(=,'substring:ck')" # 找到值包含 “ck” 的键值对 |
SingleColumnValueFilter | 在指定列族:列中的单元格进行值过滤 返回单元格所在的行 | scan 'Student', FILTER => "SingleColumnValueFilter ('StuInfo','Name', '=', 'substring:jack')" |
SingleColumnValueExcludeFilter | 排除成功匹配的单元格值,返回该行的其他值 | scan 'Student', FILTER => "SingleColumnValueExcludeFilter ('StuInfo','Name', '=', 'substring:jack')" |
HBase其他过滤器
HBase 还有一些其他过滤器,如下表所示:过滤器 | 功能描述 | 使用示例 |
---|---|---|
ColumnCountGetFilter | 每行返回键值对的个数,仅在 get 命令中使用 | get 'Student', '002', FILTER => "ColumnCountGetFilter(1)" |
TimestampsFilter | 时间戳过滤器,等值过滤 | scan 'Student', FILTER => "Timestamps Filter(1,2)" |
InclusiveStopFilter | 设置停止行,并包含该行可以实现提前停止 | scan 'Student', {STARTROW => '001', ENDROW => '004', FILTER => "Inclusive Stop Filter('002')"} |
PageFilter | 查询结果按行分页 | scan 'Student', {STARTROW => '001', ENDROW => '005', FILTER => "Page Filter(2)"} |
ColumnPaginationFilter | 对一行的所有列分页,返回 [limit, offset] 之内的列 | scan 'Student', {STARTROW => '001', ENDROW => '005', FILTER => "Column Pagination Filter(2,1)"} # offset 为 1,取 2 列 |