Фильтр проверки Hbase на наличие записей, в которых отсутствует столбец или значение столбца равно null

#java #hadoop #hbase #database-scan

#java #hadoop #hbase #проверка базы данных

Вопрос:

У меня есть 3 столбца {col1, col2, col3} в семействе столбцов (CF). Я хотел бы написать сканирование таким образом, чтобы я выбирал все строки, которые есть col1='val1' and col2='val2' and (col3 is missing or col3 is null) .

Делаю это на 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 и сравнение с пустой строкой.

Комментарии:

1. Мне не нужно было устанавливать значение filterifmissing(false); я думаю, что по умолчанию оно равно false

Ответ №2:

Я думаю, что следующий код может вам помочь:

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