【问题标题】:Filters in HBase: Designed to filter data row-wise, or column-wise, or both?HBase 中的过滤器:旨在按行或按列或两者过滤数据?
【发布时间】:2016-02-02 21:48:11
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: filter hbase happybase


    【解决方案1】:

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

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

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

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

    或者,您可以使用KeyOnlyFilter 而不是FirstKeyOnlyFilter,这将使与返回的每一列关联的值无效。这应该使您能够根据需要进行匹配,同时最小化返回的数据。

    【讨论】:

    • 有趣。但是如果我想减少网络 i/o 但不一定从数据库中读取呢?即,“将行的 cf:c 值为 x 的所有行键返回给我”
    • @eriophora 回答您上面的评论:使用 columnvalue 过滤器和 FirstKeyOnlyFilter 并将“必须匹配所有”参数传递给您的扫描对象。
    • @halil 谢谢!你的意思是SingleColumnValueFilter
    • 必须全部匹配是 java API 中 FilterList 的一部分。与HBase filter api中的AND含义相同。
    • @eriophora 是的,抱歉不知道确切的名字。
    猜你喜欢
    • 1970-01-01
    • 2016-02-05
    • 2017-08-19
    • 1970-01-01
    • 2022-10-13
    • 2019-03-26
    • 2018-06-28
    • 1970-01-01
    • 2022-08-16
    相关资源
    最近更新 更多