HBase: записи возвращены там, где поле отсутствует - PullRequest
2 голосов
/ 01 апреля 2019

У меня есть таблица персон в 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 Ответ

1 голос
/ 03 апреля 2019

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

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)"}    
...