#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.