Как отфильтровать строки с данным столбцом (не ноль)?

Я хочу сделать 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 не соответствует требованию.

Другие вопросы по тегам