hbase scan中匪夷所思的SingleColumnValueFilter和COLUMNS

假设关系型数据库中存在如下表(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).




时间: 2024-09-28 09:42:13

hbase scan中匪夷所思的SingleColumnValueFilter和COLUMNS的相关文章

hive数据批量导入hbase过程中遇到分区文件不存在异常

问题描述 hive数据批量导入hbase过程中遇到分区文件不存在异常 在做一个hive数据批量导入hbase的方法,根据官方文档一步一步的做下来,但是在生成HFILE文件时却报了一个比较让人纠结的错误,在网上找了很长时间,都木有合适的答案,在hive命令行中执行的代码如下: SET mapred.reduce.tasks=5; SET hive.mapred.partitioner=org.apache.hadoop.mapred.lib.TotalOrderPartitioner; SET t

Java在HBase数据库中创建一个数据表的实例

要通过Java在HBase中创建一个数据表,首先需要导入hbase-client.jar驱动包.可以在项目pom.xml配置文件中添加依赖: <dependency>     <groupId>org.apache.hbase</groupId>     <artifactId>hbase-client<artifactId>     <version>1.1.0.1</version><dependency>

HBase数据库中HTable和HTablePool使用注意事项

HTable和HTablePool都是HBase客户端API的一部分,可以使用它们对HBase表进行CRUD操作.下面结合在项目中的应用情况,对二者使用过程中的注意事项做一下概括总结. HTable HTable是HBase客户端与HBase服务端通讯的Java API对象,客户端可以通过HTable对象与服务端进行CRUD操作(增删改查).它的创建很简单: Configuration conf = HBaseConfiguration.create(); HTable table = new

Hbase在小米中的应用与实践

2014年3月25日星期二,CSDN在线培训"HBase在小米中的应用实践"将和大家见面了! HBase是一个分布式的.面向列的开源数据库,该技术来源于Chang et al所撰写的Google论文"Bigtable:一个结构化数据的分布式存储系统".就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力.HBase是Apache的Hadoop项目的子项目.H

HBase在数据统计应用中的使用总结

1. 数据统计的需求 互联网上对于数据的统计,一个重要的应用就是对网站站点数据的统计,例如CNZZ站长统计.百度统计.Google Analytics.量子恒道统计等等. 网站站点统计工具无外乎有以下一些功能: 1)网站流量统计:包括PV.UV.IP等指标,这些统计指标可以以趋势图的形式展示出来,如最近一周.最近一个月等. 2)IP来源信息统计:记录各个来源IP下的访问PV数. 3)访问来源分析:记录访客是从哪些途径到达本网站的. 4)搜索引擎及搜索关键词分析:对于各个指定搜索引擎带来访问PV的

HBase在数据统计应用中的使用心得

1. 数据统计的需求 互联网上对于数据的统计,一个重要的应用就是对网站站点数据的统计,例如CNZZ站长统计.百度统计.Google Analytics.量子恒道统计等等. 网站站点统计工具无外乎有以下一些功能: 1)网站流量统计:包括PV.UV.IP等指标,这些统计指标可以以趋势图的形式展示出来,如最近一周.最近一个月等. 2)IP来源信息统计:记录各个来源IP下的访问PV数. 3)访问来源分析:记录访客是从哪些途径到达本网站的. 4)搜索引擎及搜索关键词分析:对于各个指定搜索引擎带来访问PV的

HBase客户端实现并行扫描

HBase中有一个类可以实现客户端扫描数据,叫做ClientScanner,该类不是并行的,有没有办法实现一个并行的扫描类,加快扫描速度呢? 如果是一个Scan,我们可以根据startkey和stopkey将其拆分为多个子Scan,然后让这些Scan并行的去查询数据,然后分别返回执行结果. 实现方式 说明:我使用的HBase版本为:cdh4-0.94.15_4.7.0. 在org.apache.hadoop.hbase.client创建ParallelClientScanner类,代码如下: p

HBase shell基础和常用命令详解

http://www.aliyun.com/zixun/aggregation/13713.html">HBase是一个分布式的.面向列的开源数据库,源于google的一篇论文<bigtable:一个结构化数据的分布式存储系统>.HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服务. 1. 简介 HBase是一个分布式的.面向列的

基于C#+Thrift操作HBase实践

在基于HBase数据库的开发中,对应Java语言来说,可以直接使用HBase的原生API来操作HBase表数据,当然你要是不嫌麻烦可以使用Thrift客户端Java API,这里有我曾经使用过的 HBase Thrift客户端Java API实践,可以参考.对于具有其他编程语言背景的开发人员,为了获取HBase带来的好处,那么就可以选择使用HBase Thrift客户端对应编程语言的API,来实现与HBase的交互. 这里,我们使用C#客户端来操作HBase.HBase的Thrift接口的定义,