使用scan命令仍然可以查询到已修改和已删除的数据
问题
为什么使用如下scan命令仍然可以查询到已修改和已删除的数据?
scan '<table_name>',{FILTER=>"SingleColumnValueFilter('<column_family>','column',=,'binary:<value>')"}
回答
由于HBase的可扩展性,在查询表的时候,默认情况下会匹配被查询列的所有版本的值,即使被删除或被修改的值也可以查询出来。对于命中列失败的行(即在某一行中不存在该列),HBase会将该行查询出来。
如果用户仅需查询该表的最新值和命中列成功的行,可使用如下查询语句:
scan '<table_name>',{FILTER=>"SingleColumnValueFilter('<column_family>','column',=,'binary:<value>',true,true)"}
使用该命令,不但可以过滤掉命中列失败的行,而且查询的是表的当前数据的最新版本的值,即不查询被修改之前的值和被删除的值。
过滤器SingleColumnValueFilter的相关参数说明如下:
SingleColumnValueFilter(final byte[] family, final byte[] qualifier, final CompareOp compareOp, ByteArrayComparable comparator, final boolean filterIfMissing, final boolean latestVersionOnly)
参数说明:
- family:需要查询的列所在的列族;
- qualifier:需要查询的列;
- compareOp:比较符,如“=”、“>”等等;
- comparator:需要查找的目标值;
- filterIfMissing:如果某一行不存在该列,是否过滤,默认值为false;
- latestVersionOnly:是否仅查询最新版本的值,默认值为false。