Как я могу пропустить строки HBase, в которых отсутствуют определенные столбцы? - PullRequest
1 голос
/ 27 марта 2012

Я пишу задание mapreduce поверх HBase, используя table mapper. Я хочу пропустить строки, которые не имеют определенных столбцов. Например, если преобразователь считывает данные из семейства «meta», столбца спецификатора «source», преобразователь должен ожидать, что что-то будет в этом столбце. Я знаю, что могу добавить столбцы к объекту проверки, но я ожидаю, что это просто ограничивает, какие строки можно увидеть при сканировании, а не какие столбцы должны быть там.

Какой фильтр можно использовать для пропуска строк без нужных столбцов?

Кроме того, сама концепция фильтра немного странная. Работает ли фильтр построчно или ключ-значение-ключ-значение? Означает ли «фильтровать строку» пропуск строки или ее включение, или просто пропустить ее через фильтр?

Есть ли где-нибудь, где это объясняется более четко, чем hbase javadocs?

Ответы [ 2 ]

2 голосов
/ 11 июля 2015
//to skip columns with Column Prefix
Filter columnFilter = new ColumnPrefixFilter(Bytes.toBytes("col-1"));
 //To skip the values
Filter valueFilter= new ValueFilter(CompareFilter.CompareOp.NOT_EQUAL,
      new BinaryComparator(Bytes.toBytes("yourvalue")));

 To Avoid the multiple column names you can pass multiple column filter with must pass all option(which is default)
Below is sample with single column filter.

Filter avoidColumnNamesFilter = new SkipFilter(columnFilter);
scan.setFilter(avoidColumnNamesFilter)
Similarly to avoid certain value pass valuefilter to skip filter
0 голосов
/ 07 апреля 2012

Книга HBase - лучшее место, чтобы ответить на большое количество вопросов: http://hbase.apache.org/book/client.filter.html в частности объясняет, как работают фильтры.

Фильтры очень эффективны, так как они выполняются на стороне сервера и уменьшают объем данных, передаваемых по сети. Я согласен, что Javadocs действительно делает семантику включения или исключения неочевидной, но я думаю, что книга проясняет: фильтры определяют, что должно быть истинно, чтобы вернуть строку клиенту.

Сканирование также является хорошим способом определения того, что должно быть возвращено, хотя вы должны быть осторожны в определении ваших сканирований. Если вы определяете сканирование, содержащее целое семейство столбцов в одном вызове API, а затем в своем коде задаете определенный спецификатор столбца, который будет возвращен, второй вызов переопределит первый вызов, и будет возвращен только этот конкретный спецификатор, и никакие другие классификаторы столбцов в семействе столбцов возвращаться не будут.

...