Hbase shell中使用Filter过滤器总结

Hbase shell中使用Filter过滤器总结

Get 和 Scan 操作都可以使用过滤器来设置输出的范围,类似于 SQL 里面的 Where 查询条件。使用 show_filters 命令可以查看当前 HBase 支持的 过滤器类型。

show_filters

在这里插入图片描述

使用过滤器的语法格式:

scan '表名',{Filter => ”过滤器(比较运算符,’比较器’)}

解释:Filter=>指明过滤的方法,整体可用大括号引用,也可以不用大括号。过滤的方法使用双引号引用,而比较方式用小括号引用。

在使用scan的时候如果不加上startRow和endRow那么都是全局检索,并且startRow和endRow是前闭后开的,查询的结果不包括endRow。

行键过滤器

RowFilter 行键过滤器:针对行键进行过滤

scan 'hbase:meta', {FILTER=> "RowFilter(=,'substring:123')"}
# 查询hbase:meta表中rowkey中包含123的数据。scan 'student',FILTER=>"RowFilter(>,'binary:002')"  
# 显示行键字节顺序大于002的键值对。

PrefixFilter 行键前缀过滤器

scan 'hbase:meta',{FILTER=>"PrefixFilter('123')"}
# 查询hbase:meta表中行键以123开头的所有数据scan 'student',FILTER=>"PrefixFilter('001')"  
# 扫描前缀为001的行键

FirstKeyOnlyFilter:扫描全表,显示每个逻辑行的第一个键值对

scan 'student',FILTER=>"FirstKeyOnlyFilter()"

InclusiveStopFilter 包含结尾过滤器 替代ENDROW返回终止条件行

endRow在使用过程中查询结果不包括endRow,可以搭配使用这个过滤器。

scan 'hbase:meta',{STARTROW=>'',ENDROW=>'',FILTER=>"InclusiveStopFilter('')"}scan 'student', {STARTROW =>'001',FILTER =>"InclusiveStopFilter('002')"}
此命令等同:
scan 'student', {STARTROW =>'001',ENDROW => '003'}
# 扫描显示行键001002范围内的键值对:

值过滤器:

ValueFilter 值过滤器

因为hbase在存储的时候是以key-value格式的列式存储,在查询遍历的时候每行每列都会遍历,所以才有这个过滤器.

除了可以查询等于,也可以查询大于、大于等于、小于、小于等于、不等于,比较的方式是字典排序。
除非在数据存储的时候存储的类型为数字类型。

substring:包含的意思、
binary:精确查询、
regexstring:正则匹配、
null:空值比较、
long:数字比较

scan 'hbase:meta',{FILTER=> "ValueFilter(=,'substring:123')"}
# 查询hbase:meta表中值包含123的数据scan 'student',FILTER=>"ValueFilter(=,'substring:19')   
# 查询值等于19的所有键值对

SingleColumnValueFilter 单列值过滤器 :在指定的列族和列中进行值过滤器。

注意:在使用单列值过滤器必须保证每行数据都有要查询的列,因为查询结果也会返回没有要查询的列的整行记录。

scan 'hbase:meta',{FILTER=>"SingleColumnValueFilter('info','server',=,'binary:chds-2:60020')"}
# 查询hbase :meta表中列簇为info.列名为server的所有数据。scan 'student', {COLUMN=>'stuinfo:age',FILTER=>"SingleColumnValueFilter('stuinfo','age',=,' binary:19')"}    
# 查询stuinfo列族age列中值等于19的所有键值对

列族与列过滤器:

FamilyFilter 列簇过滤器

scan 'hbase:meta',{FILTER=>"FamilyFilter(=,'binary:info')"}scan 'student',FILTER=>"FamilyFilter(=,'substring:stu’)”    
# 显示列族前缀为stu开头的键值对;

QualifierFilter 列名过滤器

scan 'hbase:meta',{FILTER=>"QualifierFilter(=,'binary:server')"}scan 'student',FILTER=>"QualifierFilter(=,'substring:name')"     
# 显示列名为name的记录;

ColumnPrefixFilter 对列名前缀进行过滤。

scan 'hbase:meta',{FILTER=>"ColumnPrefixFilter('server')"}
# 查询hbase:meta表中以server开头的列的所有数据scan 'student',FILTER=>"ColumnPrefixFilter('name’)”   
# 显示列名为name的记录;

MultipleColumnPrefixFilter 多列名前缀过滤器 可以指定多个前缀

scan 'hbase:meta',{FILTER=>"MultipleColumnPrefixFilter('servedr','regioninfo')"}
# 查询hbase:meta表中以server和regioninfo开头的列的所有数据scan 'student',FILTER=>"MultipleColumnPrefixFilter('name','age')"  
# 显示列名为name和age的记录;

ColumnRangeFilter :设置范围按字典序对列名进行过滤;

scan 'student',FILTER=>"ColumnRangeFilter('bi',true,'na',true)"

其他过滤器

PageFilter 分页过滤器 基于行的分页过滤器,设置返回行数。

分页过滤器要和startRow搭配使用,和LIMIT功能类似。

过滤器搭配使用的时候分页过滤器要放在最后。

但是如果是页面开发使用java api操作,分页过滤器有一个缺点就是必须一页一页翻页,因为要传递startRow的值,和ES的深度分页类似

scan 'hbase:meta',{FILTER=>"PageFilter(2)",STARTROW=>''}
scan 'hbase:meta',{LIMIT=>2,STARTROW=>''}scan 'student',FILTER=>"ColumnPaginationFilter(2,1)"  
# 显示每行第1列之后的2个键值对

SingleColumnValueExcludeFilter 单列值不包含过滤器,和单列值过滤器类似

scan 'hbase:meta',{FILTER=>"SingleColumnValueExcludeFilter('info','server',=,'binary:chds-2:60020')"}

ColumnCountGetFilter :限制每个逻辑行返回的键值对数

get 'student','001',FILTER=>"ColumnCountGetFilter(3)"   
# 返回行键为001的前3个键值对

ColumnPaginationFilter :基于列的进行分页过滤器,需要设置偏移量与 返回数量

scan 'student',FILTER=>"ColumnPaginationFilter(2,1)"  
# 显示每行第1列之后的2个键值对

综合运用

多个过滤条件一起使用

scan 'myTable', { COLUMNS => 'cf:abc', FILTER => "ValueFilter(=, 'substring:myvalue')"}scan 'tableName', {COLUMNS=>['CF:qualifier1', 'CF:qualifier2'], LIMIT=>10,
FILTER=>SingleColumnValueFilter.new(Bytes.toBytes('CF'),
Bytes.toBytes('qualifier1'), CompareFilter::CompareOp.valueOf('EQUAL'),
Bytes.toBytes('value'))}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部