Java Hbase扫描筛选缺少列或列值为空的记录

Java Hbase扫描筛选缺少列或列值为空的记录,java,hadoop,hbase,database-scan,Java,Hadoop,Hbase,Database Scan,我在一个col族(CF)中有3个col{col1,col2,col3}。我希望编写一个扫描,以便选择所有具有col1='val1'和col2='val2'且(col3缺失或col3为null)的行 在Java中执行此操作-抱歉,我对hbase完全陌生;-) 我自己在网上很难找到答案。我终于明白了,这很简单,只是没有回答: Scan scanner = new Scan(); SingleColumnValueFilter filter = new SingleColumnVal

我在一个col族(CF)中有3个col{col1,col2,col3}。我希望编写一个扫描,以便选择所有具有
col1='val1'和col2='val2'且(col3缺失或col3为null)
的行


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

我不必设置Filterifmissing(false);我认为默认情况下这是错误的