在hbase中指定多个过滤器

时间:2013-08-26 11:43:25

标签: java hbase

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

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

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

3 个答案:

答案 0 :(得分:22)

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

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

答案 1 :(得分:7)

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

FilterList.Operator.MUST_PASS_ALL

表示必须传递所有过滤器(AND条件)。 使用

FilterList.Operator.MUST_PASS_ONE 

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

答案 2 :(得分: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);