我对过滤器在hbase中的工作方式感到困惑(或者,大体上相当于,在happybase中——我使用它与hbase交互)。我困惑的根源是我似乎无法理解过滤器的作用。
一些过滤器,比如 SingleColumnValueFilter
,使行不会基于其中一列的值发出。这是有道理的——在我看来,这就是过滤器的用途。但是,其他过滤器,如 FirstKeyOnlyFilter
,似乎不是按行过滤,而是按列过滤向请求者显示的数据,即按列过滤,如 columns
争论。不仅如此,它们似乎还影响其他过滤器是否能够访问数据。
也许我只是用错了。但是,对我来说,“过滤器”应该根据对其属性进行操作的输出来删除项目,比如“查找所有身高超过7英尺的人!”但是 FirstKeyOnlyFilter
,至少在hbase中,似乎更像是“给我每个人的左耳,不要别的!”此外,如果我有一个过滤器,如: SingleColumnValueFilter('body', 'height', =, 'regexstring:^over7ft$') AND FirstKeyOnlyFilter
, FirstKeyOnlyFilter
似乎限制第一个筛选器访问列family:column "body:height".
这个设计选择是什么?上面的过滤器看起来像是在说,“给我一个7英尺高的人的名字!”相反,它说的更像是“如果名字有7英尺高的话,就把每个名字都告诉我吧!”行的第一个键没有列,就像名称可以说有“height”一样
我做错什么了?这是happybase的一个特性还是hbase本身的特性?
1条答案
按热度按时间csga3l581#
筛选器在每行中可用的列上都匹配。
正如您所注意到的,一些hbase过滤器限制返回给客户机的列。这是一种有意的设计选择,旨在减少客户端调用期间使用的内存和网络资源量。
回想一下,hbase实际上是一个rowkeyMap到一系列键值对(键值中的键称为列限定符)。它们并不是严格意义上的集合,因为底层数据抽象实际上是一个rowkey+columnqualifier值(单元格)。过滤器在单元级别工作。这也是为什么建议列限定符要短的原因,因为它们实际上与每一行/值一起存储。
这个
FirstKeyOnlyFilter
被设计为返回尽可能少的数据,同时保持rowkey确实存在的知识和一些键值Map。它可以是返回的任何键值Map。或者,您可以使用
KeyOnlyFilter
而不是FirstKeyOnlyFilter
它将使与返回的每个列关联的值为空。这将使您能够根据需要进行匹配,同时最小化返回的数据。