Как отфильтровать строки с заданным столбцом (не null)?
Я хочу сделать сканирование hbase с фильтрами. Например, моя таблица имеет семейство столбцов A,B, C и A имеет столбец X. Некоторые строки имеют столбец X, а некоторые нет. Как я могу реализовать фильтр для фильтрации всех строк со столбцом X?
3 ответов
Я думаю, вы ищете SingleColumnValueFilter
в HBase. Как говорится в API
чтобы предотвратить испускание всей строки, если столбец не найден в строке, используйте
setFilterIfMissing(boolean)
на объекте фильтра. В противном случае, если столбец найден, вся строка будет выдана только в том случае, если значение пройдет. Если значение не удается, строка будет отфильтрована.
но SingleColumnValueFilter
хотел бы, чтобы значение имело столбец X "CompareOp" к чему-то, скажем, принесите это строка, если ColumnX = = " X"
или
принесите эту строку, если ColumnX != "Значение sentinel, которое ColumnX никогда не сможет принять" и setFilterIfMissing(true)
Так что если ColumnX имеет некоторое значение, оно возвращается.
надеюсь, это подтолкнет вас в правильном направлении.
можно использовать SkipFilter вместе с ColumnPrefixFilter. ColumnPrefixFilter получает ключи, где столбец существует (строка HBase будет иметь только столбец, если он имеет значение) фильтр пропуска даст вам "не" на первом фильтре, поэтому строка будет опущена
Анкит Арнон user1573269
единственный способ заставить его работать, как показано ниже
Итак - у меня есть таблица со столбцами rule1, rule2 , rule3 и так далее. Строки могут иметь только столбец rule1, или rule1 и rule2, или rule1 и rule2 и rule3 и так далее. Скажем - я хочу извлечь строки, в которых есть только rule1. Теперь это означает, что мне придется пропустить строки, в которых есть rule2.
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 пропустит те, которые не удовлетворяют условию. Следовательно, построение его из ColumnPrefixFilter не соответствует требованию.