HBase : Designed to filter data row-wise, 中的过滤器或按列过滤,或两者兼而有之?

标签 filter hbase happybase

我对过滤器在 HBase 中的工作方式感到困惑(或者,在很大程度上,在 HappyBase 中——我用它来与 HBase 交互)。我困惑的根源在于我似乎无法理解过滤器的作用。

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

也许我只是用错了它们。但是,对我来说,“过滤器”应该根据对其属性进行操作的输出来删除项目,例如“找到所有高度超过 7 英尺的人!”但是 FirstKeyOnlyFilter 的行为,至少在 HBase 中,似乎更类似于“给我每个人的左耳,别无其他!”此外,如果我有一个像这样的过滤器:

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

这个设计选择是什么?上面的过滤器看起来像是在说:“请告诉我每个高度正好 7 英尺的人的名字!”相反,它更像是在说“如果名字有 7 英尺高,请让我知道每个名字!”。行的第一个键没有列,就像名称没有“高度”一样。

我做错了什么?这是 HappyBase 的特性还是 HBase 本身也一样?

最佳答案

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

正如您所注意到的,一些 HBase 过滤器限制返回给客户端的列。这是有意的设计选择,旨在减少客户端调用期间使用的内存和网络资源量。

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

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

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

关于HBase : Designed to filter data row-wise, 中的过滤器或按列过滤,或两者兼而有之?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35164407/

相关文章:

filter - 是否可以过滤 flickr API 调用以获取安全图片?

javascript - d3/javascript 根据输入过滤数据

python - 如何解决Django ValueError : Field 'id' expected a number

hadoop - 在 Amazon EMR 上使用来自 java 的 hbase 时遇到问题

python - 导入错误 : No module named happybase

arrays - Swift Array of Ints - 查找与前一个元素的差异大于 10 的索引

java - 有没有办法通过python反序列化java对象

scala - 如何在 HBase 中编码 float/double/integer 值?

python - 根据时间戳搜索最新的行