Как отфильтровать строки с данным столбцом (не ноль)?
Я хочу сделать hbase-сканирование с фильтрами. Например, в моей таблице есть семейство столбцов A,B,C и A, где есть столбец X. Некоторые строки имеют столбец X, а некоторые - нет. Как я могу реализовать фильтр для фильтрации всех строк в столбце X?
3 ответа
Я думаю, вы ищете SingleColumnValueFilter
в HBase. Как указано в API
Чтобы предотвратить вывод всей строки, если столбец не найден в строке, используйте
setFilterIfMissing(boolean)
на объекте фильтра. В противном случае, если столбец найден, вся строка будет выдана только при прохождении значения. Если значение не выполнено, строка будет отфильтрована.
Но SingleColumnValueFilter
хотел бы, чтобы значение имело столбец X "CompareOp" для чего-либо, скажем, приведите эту строку, если ColumnX == "X", или приведите эту строку, если ColumnX!= "Сторожевое значение, которое ColumnX никогда не сможет принять", и setFilterIfMissing(true)
так что если ColumnX имеет какое-то значение, оно возвращается.
Я надеюсь, что это подталкивает вас в правильном направлении.
Вы можете использовать SkipFilter вместе с ColumnPrefixFilter. ColumnPrefixFilter получает ключи там, где существует столбец (строка HBase будет иметь столбец только в том случае, если у него есть значение), фильтр Пропустить даст вам "Не" в первом фильтре, поэтому строка будет опущена
Анкит Арнон user1573269
Единственный способ, которым я мог заставить это работать, как ниже
Итак - у меня есть таблица со столбцами rule1, rule2, rule3 и так далее. Строки могут иметь только столбец rule1, или rule1 и rule2, или rule1 и rule2 и rule3 и так далее. Скажем - я хочу извлечь строки, в которых есть ТОЛЬКО rule1. Теперь это означает, что мне придется пропустить строки, в которых есть правило2.
Scan getRules = new Scan();
ColumnPrefixFilter rule1Filter = new ColumnPrefixFilter(Bytes.toBytes("rule1"));
SingleColumnValueFilter skipRule2Value = new SingleColumnValueFilter(Bytes.toBytes("rules"),Bytes.toBytes("rule2"),
CompareOp.EQUAL,Bytes.toBytes("0"));
SkipFilter skipRule2 = new SkipFilter(skipRule2Value);
getRules.setFilter(rule1Filter);
getRules.setFilter(skipRule2);
ResultScanner scanner = htable.getScanner(getRules);
Хотя это сработало, я не очень доволен решением. Hbase требует времени, чтобы понять. Я бы подумал, что должен быть более простой прямой метод, который не должен проверять значение. Арнон, твой метод не работает, потому что SkipFilter пропустит те, которые DONOT удовлетворяют условию. Следовательно, создание его из ColumnPrefixFilter не соответствует требованию.