【问题标题】:How can I skip HBase rows that are missing specific columns?如何跳过缺少特定列的 HBase 行?
【发布时间】:2023-03-12 09:49:01
【问题描述】:

我正在使用表映射器在 HBase 上编写 mapreduce 作业。我想跳过没有特定列的行。例如,如果映射器从“元”族、“源”限定符列中读取,则映射器应该期望该列中有某些内容。我知道我可以向扫描对象添加列,但我希望这只会限制扫描可以看到哪些行,而不是哪些列需要存在。

我可以使用什么过滤器来跳过没有我需要的列的行?

另外,过滤器概念本身有点奇怪。过滤器是逐行操作还是逐键值操作? “过滤一行”是指跳过该行或包含它,还是简单地将其通过过滤器?

有没有比 hbase javadocs 解释得更清楚的地方?

【问题讨论】:

    标签: java filter mapreduce hbase


    【解决方案1】:

    HBase 书籍是回答大量问题的最佳场所: http://hbase.apache.org/book/client.filter.html 特别解释了过滤器的工作原理。

    过滤器非常有效,因为它们是在服务器端执行的,可以减少通过网络传输的数据量。我同意 javadocs 确实使包含或排除的语义不明显,但我认为这本书说得很清楚:过滤器定义了必须为真才能将行返回给客户端。

    扫描也是定义必须返回的内容的好方法,但您需要小心定义扫描的方式。如果您将扫描定义为在一次 api 调用中包含整个列族,然后在代码中定义要返回的特定列限定符,则第二次调用将覆盖第一次调用,并且仅返回该特定限定符,并且不会返回列族中的其他列限定符。

    【讨论】:

      【解决方案2】:
      //to skip columns with Column Prefix
      Filter columnFilter = new ColumnPrefixFilter(Bytes.toBytes("col-1"));
       //To skip the values
      Filter valueFilter= new ValueFilter(CompareFilter.CompareOp.NOT_EQUAL,
            new BinaryComparator(Bytes.toBytes("yourvalue")));
      
       To Avoid the multiple column names you can pass multiple column filter with must pass all option(which is default)
      Below is sample with single column filter.
      
      Filter avoidColumnNamesFilter = new SkipFilter(columnFilter);
      scan.setFilter(avoidColumnNamesFilter)
      Similarly to avoid certain value pass valuefilter to skip filter
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-04
        • 1970-01-01
        • 2017-12-08
        相关资源
        最近更新 更多