我在Col族(CF)中有3个cols {col1,col2,col3}。我想写一个扫描,以便我选择所有具有col1='val1' and col2='val2' and (col3 is missing or col3 is null)
的行。Hbase扫描筛选器记录缺失列或列值为空
在Java中这样做 - 对不起,我完全陌生的HBase的;-)
我在Col族(CF)中有3个cols {col1,col2,col3}。我想写一个扫描,以便我选择所有具有col1='val1' and col2='val2' and (col3 is missing or col3 is null)
的行。Hbase扫描筛选器记录缺失列或列值为空
在Java中这样做 - 对不起,我完全陌生的HBase的;-)
我有很多的麻烦网上找到一个答案,这个自己。我终于想通了,它很简单 - 只是没有答案:
Scan scanner = new Scan();
SingleColumnValueFilter filter = new SingleColumnValueFilter(
Bytes.toBytes("some family"),
Bytes.toBytes("some column"),
CompareFilter.CompareOp.EQUAL,
Bytes.toBytes("")
);
filter.setFilterIfMissing(false);
scanner.setFilter(filter);
return scanner;
解决方案的关键部位设置setFilterIfMissing
为false,并与空字符串比较。
我认为下面的代码可以帮助你:
FilterList filterList = new FilterList();
SingleColumnValueFilter filter1 = new SingleColumnValueFilter(Bytes.toBytes("someFamily"), Bytes.toBytes("col1"), CompareFilter.CompareOp.EQUAL, Bytes.toBytes("val1"));
filter1.setFilterIfMissing(true);
filterList.addFilter(filter1);
SingleColumnValueFilter filter2 = new SingleColumnValueFilter(Bytes.toBytes("someFamily"), Bytes.toBytes("col2"), CompareFilter.CompareOp.EQUAL, Bytes.toBytes("val2"));
filter2.setFilterIfMissing(true);
filterList.addFilter(filter2);
SingleColumnValueFilter filter3 = new SingleColumnValueFilter(Bytes.toBytes("someFamily"), Bytes.toBytes("col3"), CompareFilter.CompareOp.EQUAL, new NullComparator());
filter3.setFilterIfMissing(false);
filterList.addFilter(filter3);
Scan scan = new Scan();
scan.setFilter(filterList);
ResultScanner resultScanner = table.getScanner(scan);
for (Result res : resultScanner) {
System.out.println(res);
}
resultScanner.close();
我没得setFilterIfMissing(假);我认为这是默认的错误 – hba