Получить ключи строки HBase в диапазоне без извлечения данных?

#hbase

#hbase

Вопрос:

Есть ли способ получить ключи строк в заданном диапазоне без фактического извлечения столбцов / CFS, связанных с этим ключом строки?

Для пояснения: В моем примере ключи строк нашей таблицы — это названия биржевых тикеров (например, GOOG), и в нашем веб-приложении мы хотели бы заполнить виджет автозаполнения, используя только ключи строк, которые у нас есть в базе данных. Очевидно, что если мы извлекаем все данные (а не только названия запасов) для всех запасов между G и H, когда пользователь вводит ‘G’, мы излишне нагружаем нашу систему. Есть идеи?

Ответ №1:

Согласно официальной документации, вы можете оптимально извлекать только ключи строк, используя комбинацию двух фильтров: KeyOnlyFilter и FirstKeyOnlyFilter. (Я думаю, что «FirstKeyOnlyFilter» вернет ключ только один раз, даже с большими сложными строками.) Если вам нужны ключи только в заданном диапазоне, вы можете добавить этот диапазон в сканер.

Вот несколько примеров кода:

 FilterList filters = new FilterList(FilterList.Operator.MUST_PASS_ALL,
            new FirstKeyOnlyFilter(),
            new KeyOnlyFilter());
Scan s = new Scan(filters);
// in order to limit the scan to a range
s.setStartRow(startRowKey);  // first key in range
s.setStopRow(stopRowKey);    // key value after the last key in the range
  

Источник:
https://hbase.apache.org/book.html#perf.hbase.client.rowkeyonly

Ответ №2:

взгляните на фильтры (http://hbase.apache.org/book/client.filter.html ), особенно KeyOnlyFilter. описание фильтра (по http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/filter/package-summary.html) является

Фильтр, который вернет только ключевой компонент каждого KV (значение будет перезаписано как пустое).

чтобы ограничить ключи в определенном диапазоне, используйте конструктор Scan(rowStart, rowEnd).

Ответ №3:

Я бы создал семейство столбцов под названием ’empty:’ и сохранил пустые значения для всех строк. Теперь вы можете просто запросить загрузку столбца ’empty:’. Это не идеально, но это лучше, чем загружать семейства столбцов с большим количеством данных.

Ответ №4:

вы можете использовать addFamily (семейство byte[]) или addFamily (семейство byte[], спецификатор byte[]) для извлечения только соответствующих данных

Ответ №5:

Одним из подходов было бы поддерживать другую таблицу индексов, в которой были бы ключи для всех возможных состояний FSA для всех запасов. Итак, в следующий раз, когда пользователь введет ‘G’, все, что вам нужно будет сделать, это нажать на эту таблицу и получить, возможно, разделенный запятыми список всех значений, относящихся к G.