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'}
# 扫描显示行键001到002范围内的键值对:
值过滤器:
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'))}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
