HBase 中的筛选器:旨在按行和/或按列筛选数据



我一直对过滤器在HBase中的工作方式感到困惑(或者,在很大程度上等同于在HappyBase中 - 我用来与HBase交互(。我困惑的根源是我似乎无法掌握过滤器的作用。

某些筛选器(如 SingleColumnValueFilter (会导致行不会根据其一列的值发出行。这是有道理的——在我看来,这就是过滤器应该做的。但是,其他过滤器(如 FirstKeyOnlyFilter(似乎不是按行进行过滤,而是过滤向请求者显示的数据 - 即,它们按列过滤,如columns参数。不仅如此,它们似乎还会影响其他过滤器是否可以访问数据。

也许我只是用错了它们。但是,对我来说,"过滤器"应该根据对其属性进行操作的输出删除项目,例如"找到所有身高超过 7 英尺的人!但FirstKeyOnlyFilter的行为,至少在HBase中,似乎更像是"把每个人都给我带上耳朵,别的什么都没有!此外,如果我有一个过滤器,例如:

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

这种设计选择是怎么回事?上面的过滤器看起来像是在说,"照亮我每个人的名字正好7英尺高!"但它更像是"如果名字是7英尺高,就照亮我每个名字!"。行的第一个键没有列,就像名称可以说具有"高度"一样。

我做错了什么?这是HappyBase的特点还是HBase本身的特色?

筛选器在

每行中可用的列上匹配两者。

正如您已经注意到的那样,某些 HBase 筛选器会限制返回到客户端的列。 这是有意的设计选择,旨在减少客户端调用期间使用的内存和网络资源量。

回想一下,HBase 实际上是映射到一系列键值对的行键(键值中的键称为列限定符(。 严格来说,它们不是一个集合,因为底层数据抽象实际上是值的行键+列限定符(一个 Cell(。 过滤器在单元格级别工作。 这也是为什么建议列限定符简短的原因,因为它们实际上与每一行/值一起存储。

FirstKeyOnlyFilter旨在返回尽可能少的数据,同时通过某些键值映射保持行键确实存在的知识。 它可以是返回的任何键值映射。

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

最新更新