HBase常用的Filter
简介:
根据技术调研的过程可以明显的体会到hbase的存储方式和数据库的存储有着明显的区别,查询的方式也有着很大不同,HBase主要是通过这种filter来对数据进行筛选。同时对于数据的体量较大(10亿级别以上的数据数据量),检索和修改的场景较多时是比较适合使用hbase。
HBase过滤器可以根据分为:列簇与列类型过滤器,行键过滤器,其他过滤器
HBase Filter 概览
查询hbase支持的filter 列表
[](javascript:void(0);)
1 | base(main):001:0> show_filters |
[](javascript:void(0);)
HBase Filter 使用简单例子
行键过滤器
RowFilter:针对行键进行过滤
1 | scan 'test',FILTER=>"RowFilter(=,'binaryprefix:row')" |
说明:把test表中rowkey 以row开头的数据查出来
支持的比较运算符:= != > >= < <= 。
PrefixFilter:行键前缀过滤器
1 | scan 'test',FILTER=>"PrefixFilter('row0')" |
说明:把test表中rowkey 以row0开头的数据查出来
FirstKeyOnlyFilter:扫描全表,显示每个逻辑行的第一个键值对
1 | scan 'test',FILTER=>"FirstKeyOnlyFilter()" |
说明:一个rowkey可以有多个version,同一个rowkey的同一个column也会有多个的值,只拿出key中的第一个column的第一个version
列簇与列过滤器
FamilyFilter:针对列族进行比较和过滤
1 | scan 'test',FILTER=>"FamilyFilter(=,'substring:f1')" |
说明:查询列簇前缀以“f1”开头的数据
QualifierFilter:列标识过滤器
1 | scan 'test',FILTER=>"QualifierFilter(=,'substring:name')" |
说明:查询所有列簇中列名是name的列数据
ColumnPrefixFilter:对列名前缀进行过滤
1 | scan 'test',FILTER=>"ColumnPrefixFilter('n')" |
说明:查询所有列簇中列以“n”开头的数据
MultipleColumnPrefixFilter:可以指定多个前缀
1 | scan 'test',FILTER=>"MultipleColumnPrefixFilter('n','m')" |
说明:查询test表,所有列簇中列名以“n“或者”m"开头的数据
ColumnRangeFilter:设置范围按字典序对列名进行过滤
1 | scan 'test',FILTER=>"ColumnRangeFilter('name',true,'music',false)" |
说明:ColumnRangeFilter过滤器则可以扫描出符合过滤条件的列范围,起始和终止列名用单引号引用,true 和 false 参数可指明结果中包含的起始或终止列。
值过滤器
ValueFilter:值过滤器,找到符合值条件的键值对
[](javascript:void(0);)
1 | 模糊查找:scan 'test', FILTER => "ValueFilter(=,'substring:张')" |
[](javascript:void(0);)
SingleColumnValueFilter:在指定的列族和列中进行比较的值过滤器
[](javascript:void(0);)
1 | scan 'test', {FILTER => "SingleColumnValueFilter('liecuA', 'name', =, 'substring:张')",FORMATTER => 'toString'} |
[](javascript:void(0);)
SingleColumnValueExcludeFilter:排除匹配成功的值
1 | scan 'test', {FILTER => "SingleColumnValueExcludeFilter('liecuA', 'name', =, 'substring:张')",FORMATTER => 'toString'} |
其他过滤器
还有一些其他的过滤器,比如与分页,时间等
ColumnCountGetFilter:限制每个逻辑行返回键值对的个数,在 get 方法中使用
1 | get 'test', 'row1', FILTER => "ColumnCountGetFilter(3)" |
TimestampsFilter:时间戳过滤,支持等值,可以设置多个时间戳
1 | scan 'test', Filter => "TimestampsFilter(1636561062,1636993106)" |
PageFilter:对查询结果按行进行分页显示
1 | scan 'test', { STARTROW => 'row1', ENDROW => 'row5', FILTER => "PageFilter(3)" } |
ColumnPaginationFilter:对一行的所有列分页,只返回 [offset,offset+limit] 范围内的列
1 | scan 'test', { STARTROW => 'row1', ENDROW => 'row5', FILTER => "ColumnPaginationFilter(2,1)" } |
总结
一次查询可以使用多个Filter进行多维度筛选 ,各Filter之间使用关系运算符:AND 或 OR 进行连接,请使用大些字母避免使用shell 方式查找无效!!!