hbase scan中匪夷所思的SingleColumnValueFilter和COLUMNS

简介: 假设关系型数据库中存在如下表(test_row_key)------------------------------------------TIME_ID    AREA_ID       INDEX1.
假设关系型数据库中存在如下表(test_row_key)
------------------------------------------
TIME_ID    AREA_ID       INDEX1
..........................................
 201206        730    201206730
 201206        731    201206731
 201207        730    201207730
 201207        731    201207731
 201207        732    201207732
 
 
让我们将数据导入hbase(测试环境Version 0.94.3, r1408904)
问题重现
// select TIME_ID, AREA_ID, INDEX1 from test_row_key where TIME_ID = 201206 and AREA_ID = 730
// 应该返回1行数据
scan 'test_row_key', {COLUMNS => ['cf:TIME_ID','cf:AREA_ID','cf:INDEX1'], FILTER => "(SingleColumnValueFilter('cf', 'TIME_ID', =, 'binary:201206')) AND (SingleColumnValueFilter('cf', 'AREA_ID', =, 'binary:730'))" }
 
// select AREA_ID, INDEX1          from test_row_key where TIME_ID = 201206 and AREA_ID = 730
// 返回2行数据??
scan 'test_row_key', {COLUMNS => ['cf:AREA_ID','cf:INDEX1'],              FILTER => "(SingleColumnValueFilter('cf', 'TIME_ID', =, 'binary:201206')) AND (SingleColumnValueFilter('cf', 'AREA_ID', =, 'binary:730'))" }
 
// select INDEX1                   from test_row_key where TIME_ID = 201206 and AREA_ID = 730
// 返回2行数据??
scan 'test_row_key', {COLUMNS => ['cf:INDEX1'],                           FILTER => "(SingleColumnValueFilter('cf', 'TIME_ID', =, 'binary:201206')) AND (SingleColumnValueFilter('cf', 'AREA_ID', =, 'binary:730'))" }
 
 
结论

只有当COLUMNS中包含SingleColumnValueFilter提到的字段时SingleColumnValueFilter才有效的

改为SingleColumnValueExcludeFilter, 这时只会返回除开AREA_ID和TIME_ID的字段, 但记录数是对的

HBase JIRA中有人对这种匪夷所思的行为产生的质疑

只有当COLUMNS中包含SingleColumnValueFilter提到的字段时, SingleColumnValueFilter才有效的

 

SingleColumnValueFiltershould be able to find the column value even when it's not specifically addedas input on the scan.

Wheneverapplying a SingleColumnValueFilter to a Scan that has specific columns as it'sinput (but not the column to be checked in the Filter), the Filter won't beable to find the value that it should be checking.

Forexample, let's say we want to do a scan, but we only need COLUMN_2 columns.Furthermore, we only want rows that have a specific value for COLUMN_1. Usingthe following code won't do the trick:
Scan scan = new Scan();
scan.addColumn(FAMILY,COLUMN_2);
SingleColumnValueFilter filter = new SingleColumnValueFilter(FAMILY, COLUMN_1,CompareOp.EQUAL, TEST_VALUE);

filter.setFilterIfMissing(true);
scan.setFilter(filter);

However,we can make it work when specifically also adding the tested column as an inputcolumn:
scan.addColumn(FAMILY,COLUMN_1);

Is this by design?Personally I think that adding a filter with columns tests should not botherthe user to check that it's also on the input. It is prone to bugs.

 

有人回复说:

Itsby design. High-level in the Scan object you say what you are interested in andthen the filter works against the Scan specification.

 

作者修改了SingleColumnValueFilter.java的doc注释

Whenusing this filter on a Scan with specified inputs, the column to be testedshould also be added as input (otherwise the filter will regard the column asmissing).

 

于是作者写了一个新的SingleColumnValueExcludeFilter,用于做单列的值过滤, 但是不查询出这个列的值

Add a new Filter thatchecks a single column value but does not emit it.

A Filter that checks a single column value,but does not emit the tested column. This will enable a performance boost overSingleColumnValueFilter, if the tested column value is not actually needed asinput (besides for the filtering itself).





相关实践学习
云数据库HBase版使用教程
  相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情: https://cn.aliyun.com/product/hbase   ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
存储 分布式数据库 Hbase
HBase scan过程简析
HBase scan过程简析。 scan过程总体上是分层处理的,与存储上的组织方式一致,脉络比较清晰; 具体来说,就是region->store→hfile/memstore,分别都有对应的scanner实现进行数据读取; scan请求本身设置的条件,以及server和table层面的一些参数限制,会根据需要分布在不同层次的scanner中进行处理; 2.
1965 0
HBase scan过程简析
|
5月前
|
分布式计算 Hadoop 关系型数据库
Hadoop任务scan Hbase 导出数据量变小分析
Hadoop任务scan Hbase 导出数据量变小分析
57 0
|
安全 Linux 分布式数据库
HBase中scan的ReadType探究
HBase中scan的ReadType存在pread和stream两种方式,本文对其原理和实现进行探究。
1537 0
|
分布式数据库 Hbase
hbase scan客户端服务端流程
hbase scan客户端服务端流程 一:基础知识了解: scanner可分为两种InternalScanner和KeyValueScanner,区别如下 1.
1391 0
|
分布式数据库 Hbase 分布式计算
hbase源码系列(十五)终结篇&Scan续集-->如何查询出来下一个KeyValue
这是这个系列的最后一篇了,实在没精力写了,本来还想写一下hbck的,这个东西很常用,当hbase的Meta表出现错误的时候,它能够帮助我们进行修复,无奈看到3000多行的代码时,退却了,原谅我这点自私的想法吧。
3383 0
|
分布式数据库 Hbase
hbase源码系列(十二)Get、Scan在服务端是如何处理?
继上一篇讲了Put和Delete之后,这一篇我们讲Get和Scan, 因为我发现这两个操作几乎是一样的过程,就像之前的Put和Delete一样,上一篇我本来只打算写Put的,结果发现Delete也可以走这个过程,所以就一起写了。
3505 0
|
Java 分布式数据库 Go
HBase的scan源码分析客户端部分之整体流程(一)
        scan的调用代码示例如下: // 创建HBase配置config Configuration config = HBaseConfiguration.create(); config.
1808 0
|
5月前
|
Java Shell 分布式数据库
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
87 0
|
9月前
|
SQL 分布式计算 Hadoop
Hadoop集群hbase的安装
Hadoop集群hbase的安装
147 0