Java 将两个过滤器列表与一次扫描中必须通过的一个/所有运算符合并

Java 将两个过滤器列表与一次扫描中必须通过的一个/所有运算符合并,java,hbase,Java,Hbase,考虑hbase外壳扫描“表”结果: ROW COLUMN+CELL 000 column=F:Q, timestamp=1519299345645, value=a 001 column=F:Q, timestamp=1519299345645, value=b 010 column=F:Q, timestamp=1519299345645, value=c 011 column=F:Q, timestamp=1519299345645, value=b 100 column=F:Q, time

考虑hbase外壳
扫描“表”
结果:

ROW COLUMN+CELL
000 column=F:Q, timestamp=1519299345645, value=a
001 column=F:Q, timestamp=1519299345645, value=b
010 column=F:Q, timestamp=1519299345645, value=c
011 column=F:Q, timestamp=1519299345645, value=b
100 column=F:Q, timestamp=1519299345645, value=a
110 column=F:Q, timestamp=1519299345645, value=c
200 column=F:Q, timestamp=1519299345645, value=b
210 column=F:Q, timestamp=1519299345645, value=a
我想要什么作为我的
扫描结果:

  • 行键以
    0
    1
  • F:Q
    值为
    a
    b
对于上述示例,其为:

ROW COLUMN+CELL
000 column=F:Q, timestamp=1519299345645, value=a
001 column=F:Q, timestamp=1519299345645, value=b
011 column=F:Q, timestamp=1519299345645, value=b
100 column=F:Q, timestamp=1519299345645, value=a
在hbase shell中,它将是(忽略我为提高可读性而放置的所有
\s
\n
):

这样,我在java中有两个筛选列表:

List<Filter> prefixFilters            = new ArrayList<>();
List<Filter> singleColumnValueFilters = new ArrayList();

PrefixFilter one  = new PrefixFilter(Bytes.toBytes("1"));
PrefixFilter zero = new PrefixFilter(Bytes.toBytes("0"));

SingleColumnValueFilter a = new SingleColumnValueFilter(
    Bytes.toBytes("F"),
    Bytes.toBytes("Q"),
    CompareFilter.CompareOp.EQUAL,
    Bytes.toBytes("a") 
);

SingleColumnValueFilter b = new SingleColumnValueFilter(
    Bytes.toBytes("F"),
    Bytes.toBytes("Q"),
    CompareFilter.CompareOp.EQUAL,
    Bytes.toBytes("b") 
);

prefixFilters.add(zero);
prefixFilters.add(one);

singleColumnValueFilters.add(a);
singleColumnValueFilters.add(b);

FilterList prefixFiltersList = new FitlerList(FilterList.Operator.MUST_PASS_ONE, prefixFilters);
FilterList singleColumnValueFiltersList = new FitlerList(FilterList.Operator.MUST_PASS_ONE, singleColumnValueFilters);
List prefixFilters=new ArrayList();
List singleColumnValueFilters=new ArrayList();
PrefixFilter one=新的PrefixFilter(字节数.toBytes(“1”);
PrefixFilter zero=新的PrefixFilter(字节.toBytes(“0”);
SingleColumnValueFilter a=新的SingleColumnValueFilter(
字节。toBytes(“F”),
字节。toBytes(“Q”),
CompareFilter.CompareOp.EQUAL,
字节。toBytes(“a”)
);
SingleColumnValueFilter b=新的SingleColumnValueFilter(
字节。toBytes(“F”),
字节。toBytes(“Q”),
CompareFilter.CompareOp.EQUAL,
字节。toBytes(“b”)
);
prefixFilters.add(零);
prefixFilters.add(一个);
singleColumnValueFilters。添加(a);
singleColumnValueFilters。添加(b);
FilterList prefixFiltersList=新的FitlerList(FilterList.Operator.MUST\u PASS\u ONE,prefixFilters);
FilterList SingleColumnValueFilterList=新的FitlerList(FilterList.Operator.MUST_PASS_ONE,singleColumnValueFilters);
问题:如何将它们与
操作符组合为一个单独的操作符,就像我在shell中所做的那样?
我希望有专门的构造函数,可以接受逻辑比较器(
/
)和多个
列表
参数。既然没有,我就卡住了

在末尾,添加

FilterList filters = new FilterList(FilterList.Operator.MUST_PASS_ALL);
filters.addFilter(prefixFiltersList);
filters.addFilter(singleColumnValueFiltersList);

scan.setFilter(filters);
这可确保两个过滤器列表都已运行,
必须通过所有
作为
条件

为什么这样做有效?根据:

由于可以将筛选器列表用作筛选器列表的子级,因此可以创建要计算的筛选器的层次结构


谢谢你的回答,我将在周一的工作中查看,并以优异的成绩回复你!
FilterList filters = new FilterList(FilterList.Operator.MUST_PASS_ALL);
filters.addFilter(prefixFiltersList);
filters.addFilter(singleColumnValueFiltersList);

scan.setFilter(filters);