Java 将两个过滤器列表与一次扫描中必须通过的一个/所有运算符合并
考虑hbase外壳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
扫描“表”
结果:
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);