Фильтр сканирования Hbase для записей, в которых отсутствует столбец или значение столбца равно нулю
У меня есть 3 cols {col1, col2, col3} в семействе col (CF). Я хотел бы написать сканирование, чтобы я выбрал все строки, которые имеют col1='val1' and col2='val2' and (col3 is missing or col3 is null)
,
Делаю это на Java - извините, я совершенно новичок в hbase;-)
2 ответа
Решение
Мне было очень трудно найти ответ на этот вопрос в Интернете. Я наконец понял это, и это довольно просто - просто без ответа:
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
в ложь и сравнение с пустой строкой.
Я думаю, что следующий код может помочь вам:
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();