HBase: записи, возвращенные там, где поле отсутствует

#hbase #hbase-shell

#hbase #hbase-оболочка

Вопрос:

У меня есть таблица person в HBase, как показано ниже —

 ROW_KEY     COLUMN CELL
dinesh      column='details:code',value=dr-01
dinesh      column='status:is_error',value=false
dinesh      column='time:date_created',value=1553747864740
dinesh      column='time:last_updated',value=1553747864740
alex        column='details:code',value=al-01
alex        column='time:date_created',value=1553747786521
alex        column='time:last_updated',value=1553747786521
  

Я хочу получить только те записи, где поле is_error равно false. Этот атрибут будет присутствовать только в определенных строках. Я попытался извлечь его с помощью SingleColumnValueFilter, но он выдает мне все записи.

Запрос:

 scan 'person', {FILTER=>"SingleColumnValueFilter('status','is_error',=,'binary:false')"}    
  

Вывод:

 ROW_KEY     COLUMN CELL
dinesh      column='details:code',value=dr-01
dinesh      column='status:is_error',value=false
dinesh      column='time:date_created',value=1553747864740
dinesh      column='time:last_updated',value=1553747864740
alex        column='details:code',value=al-01
alex        column='time:date_created',value=1553747786521
alex        column='time:last_updated',value=1553747786521
  

Ожидаемым результатом должна быть только одна строка, соответствующая заданному условию, но она возвращает две строки, где поле is_error отсутствует.

Ответ №1:

Вам нужно использовать другой конструктор для вашего фильтра:

 protected SingleColumnValueFilter(byte[] family,
                                  byte[] qualifier,
                                  CompareOperator op,
                                  ByteArrayComparable comparator,
                                  boolean filterIfMissing,
                                  boolean latestVersionOnly)
  

filterIfMissing гарантирует, что строки, не содержащие ваш столбец, не будут возвращены. Я понятия не имею, почему это не поведение по умолчанию.

Ваше сканирование должно быть:

 scan 'person', {FILTER=>"SingleColumnValueFilter('status','is_error', =, 'binary:false', true, true)"}