【问题标题】:Specify multiple filters in hbase在 hbase 中指定多个过滤器
【发布时间】:2013-08-26 11:43:25
【问题描述】:

有没有办法在扫描期间指定多个过滤器?例如 - 同时指定 ColumnFamilyFilterRowFilter?

Filter rowFilter =
                new RowFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator(
                        rowFilterString));
        Scan s = new Scan();
        s.setFilter(rowFilter);

我还想将ColumnFilter 添加到s。但它显然会覆盖最新的过滤器。

【问题讨论】:

    标签: java hbase


    【解决方案1】:

    您必须创建一个FilterList 对象,并添加您想要的所有过滤器,并将此FilterList 对象设置为过滤器。您可以使用构造函数或使用addFilter() 方法将过滤器添加到过滤器列表中。

    FilterList filterList = new FilterList();
    filterList.addFilter(new RowFilter(...));
    filterList.addFilter(new ColumnFilter(...));
    Scan s = new Scan();
    s.setFilter(filterList);
    

    【讨论】:

      【解决方案2】:

      如果您要添加多个过滤器,请记住默认情况下 filterlist 使用

      FilterList.Operator.MUST_PASS_ALL
      

      这意味着必须通过所有过滤器(AND 条件)。 使用

      FilterList.Operator.MUST_PASS_ONE 
      

      如果您想对过滤器应用 OR 条件。

      【讨论】:

        【解决方案3】:

        您可以使用 FilterList 对象添加过滤器列表,并可以使用 ArrayList 控制过滤器的顺序。每个FilterList 只接受一个运算符[OR, AND]。但是,可以通过将具有自己的运算符的多个过滤器列表实例添加到父过滤器列表来创建过滤器列表的层次结构。

        例如: filters_1 & filters_2 是两个过滤器列表。

        FilterList filterList1 = new FilterList(FilterList.Operator.MUST_PASS_ONE,filters_1);
        FilterList filterList2 = new FilterList(FilterList.Operator.MUST_PASS_ALL,filters_2);
        
        
        List<Filter> filterAggregate = new ArrayList<>();
        filterAggregate.add(filterList1);
        filterAggregate.add(filterList2);
        
        FilterList filterList3 = new FilterList(FilterList.Operator.MUST_PASS_ALL,filterAggregate);
        

        【讨论】:

          猜你喜欢
          • 2017-04-25
          • 2013-11-24
          • 2011-07-17
          • 2016-10-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-07
          相关资源
          最近更新 更多