2014-06-23 125 views
3

我在Col族(CF)中有3个cols {col1,col2,col3}。我想写一个扫描,以便我选择所有具有col1='val1' and col2='val2' and (col3 is missing or col3 is null)的行。Hbase扫描筛选器记录缺失列或列值为空

在Java中这样做 - 对不起,我完全陌生的HBase的;-)

回答

1

我有很多的麻烦网上找到一个答案,这个自己。我终于想通了,它很简单 - 只是没有答案:

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,并与空字符串比较。

+0

我没得setFilterIfMissing(假);我认为这是默认的错误 – hba

0

我认为下面的代码可以帮助你:

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();