2016-02-02 22 views
2

我一直对HBase中的过滤器如何工作感到困惑(或者,大体上等同于HappyBase--我用它来与HBase进行交互)。我混乱的根源是,我似乎无法控制过滤器的功能。HBase中的过滤器:设计用于按行或按列还是两者过滤数据?

某些过滤器(如SingleColumnValueFilter)会导致不根据其某列的值排放行。这是有道理的 - 在我看来,这是过滤器应该是的。但是,像FirstKeyOnlyFilter这样的其他过滤器似乎不是按行方向进行过滤,而是过滤出呈现给请求者的数据 - 即,它们过滤列为,如columns参数。不仅如此,它们似乎影响其他过滤器是否可以访问数据。

也许我只是用它们错了。但是,对我来说,一个“过滤器”应该根据对其属性进行操作的输出来移除项目,例如“找到我身高超过7英尺的所有人!”但至少在HBase中,FirstKeyOnlyFilter的行为似乎更类似于“让我的每个人都离开耳朵,没有别的东西!”此外,如果我有以下过滤器:

SingleColumnValueFilter('body', 'height', =, 'regexstring:^over7ft$') AND FirstKeyOnlyFilterFirstKeyOnlyFilter似乎限制第一个过滤器访问列族:column“body:height”。

这是什么设计选择?上面的过滤器看起来像是在说:“让我身高七英尺高的每个人都明白我的名字!”而是说的更像是“如果名字高7英尺,让我明白我的名字!”。一行中的第一个关键字没有列,只有名称可以说有一个“高度”。

我在做什么错?这是HappyBase的一个特点,还是与HBase本身一样?

回答

2

过滤器匹配每行中可用的列。

正如您已经注意到一些HBase过滤器限制返回给客户端的列。这是一种有意的设计选择,可以减少客户端调用期间使用的内存和网络资源的数量。回想一下,HBase实际上是对一系列键值对(key-value中的键被称为列限定符)的rowkey映射。它们不是严格意义上的底层数据抽象集合,它实际上是一个rowkey + columnQualifier(cell)。过滤器在单元级别工作。这也是为什么列限定符被推荐为短的原因,因为它们实际上与每行/值一起存储。

FirstKeyOnlyFilter旨在恢复尽可能少的数据成为可能,同时保持一个rowkey也有一些键 - 值映射存在的知识。它可以是任何返回的键值映射。

或者,您可以使用KeyOnlyFilter而不是FirstKeyOnlyFilter,它将清空与返回的每列相关联的值。这应该使您能够根据需要进行匹配,同时最大限度地减少返回的数据。

+0

有趣。但是,如果我想减少网络I/O但不一定从数据库读取数据呢?即,“回到我身边所有的行键,其中该行已比照:x的C值” – eriophora

+0

我已经更新了答案 –

+0

@eriophora回答您的评论以上:使用columnvalue过滤器和FirstKeyOnlyFilter并传递参数“必须全部匹配”到您的扫描对象。 – halil