Вы создаете свой конечный ключ с ( row, column family, column qualifier )
в качестве байтовых массивов, а оставшиеся измерения ключа ( column visibility, timestamp )
устанавливаются в значения по умолчанию (в частности, пустой байтовый массив и Long.MAX_VALUE
соответственно).
Сканер остановится на этом точном ключе включительно.Однако фактический ввод данных почти наверняка не является ключом , точным (вы не предоставили свою реализацию makeRecord
для проверки).Даже если ваши данные на самом деле имеют видимость пустого столбца, отметка времени почти наверняка будет не Long.MAX_VALUE
, а скорее чем-то, что вы установили в своей реализации makeRecord
, или она была установлена на основе времени сервера или какого-то логического счетчика таблицы.Поскольку размер временной метки ключа упорядочен по убыванию, ваш сканер прекратит поиск данных на Long.MAX_LONG
, прежде чем он достигнет ваших записей.
Это немного похоже на поиск в словаре для analogy
, но останавливается, когдавы достигнете analog
: пропустите оставшиеся слова, начинающиеся с analog
.
Это распространенная ошибка при построении диапазонов на основе точных ключей.Как правило, лучше создавать диапазоны на основе строк (включая строки, включающие всю строку), а не ключей (для этого есть конструктор Range
).Или указать конечный ключ, чтобы он работал исключительно.Вы можете сделать это, добавив нулевой байт в конец вашего последнего значащего элемента столбца.Например, вы можете сделать что-то вроде:
Key endKey = new Key(rowId.getBytes(),
columnFamily.getBytes(),
(deterTimes.get(4) + "\0").getBytes());
Range range = new Range(startKey, true, endKey, false);
Еще одна ловушка, с которой вам следует быть осторожным, это использовать String.getBytes()
для получения ваших байтовых массивов без указания кодировки.Было бы лучше использовать что-то непротиворечивое, например "abc".getBytes(StandardCharsets.UTF_8)
(хотя я обычно делаю статический импорт, поэтому я могу указать только UTF_8
).