首页 > 编程笔记 > MySQL笔记 阅读:4

HBase过滤器详解(附带实例)

HBase 过滤器用于条件查询,这个功能类似于 SQL 语句中的 where 语句。在使用 get/scan 命令查询数据时,可以使用过滤器限定输出范围。

查看当前 HBase 支持的过滤器可以使用 show_filters 命令,所得到的结果如下:
hbase(main):007:0* show_filters
DependentColumnFilter
KeyOnlyFilter
ColumnCountGetFilter
SingleColumnValueFilter
PrefixFilter
SingleColumnValueExcludeFilter
FirstKeyOnlyFilter
ColumnRangeFilter
过滤器的使用格式如下:
scan 'Student',{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 其他的行键过滤器如下表所示:

表: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

其他的列(族)过滤器如下表所示:

表:HBase 其他列(族)过滤器
列过滤器 功能描述 使用示例
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 数据表中单元格的数据进行过滤。值过滤器如下表所示:

表: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 还有一些其他过滤器,如下表所示:

表: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 列

相关文章