Hbase сканировать несколько версий в порядке вставки - PullRequest
0 голосов
/ 25 сентября 2018

Я хочу сделать сканирование таблицы hbase на 10 версий.Но результат дает мне данные в последнем и старом порядке.Я хочу получить это в обратном порядке.Есть ли способ сделать это?

Пример:
Если я помещаю данные в таблицу 'test' в следующем порядке:

put 'test','1','data:a','v0'
put 'test','1','data:a','v1'
put 'test','1','data:a','v2'

Сканирование 3 версий дает мне следующий порядок:

scan 'test',{VERSIONS=>3}
ROW COLUMN+CELL
1  column=data:a, timestamp=1537869886607, value=v2
1  column=data:a, timestamp=1537869884212, value=v1
1  column=data:a, timestamp=1537869881996, value=v0

Я хочу получить результат в обратном порядке.

Мой полный вариант использования - сканирование и сдача, поэтому, если я получу результат в порядке от последнего к самому старому, я будупишу в обратном порядке, когда я поставлю.
Код здесь:

Scan scan = new Scan();
scan.setCacheBlocks(false);
scan.setCaching(10000);
scan.setMaxVersions(10);
ResultScanner scanner = tableGet.getScanner(scan);
for (Result result = scanner.next(); result != null; result = scanner.next()) {
  String row = new String(result.getRow());
  Put put = new Put(Bytes.toBytes(row));
  String key = "KEY" + ";" + row;
  for (Cell cell : result.rawCells()) {
    String family = Bytes.toString(CellUtil.cloneFamily(cell));
    String column = Bytes.toString(CellUtil.cloneQualifier(cell));
    byte[] value = CellUtil.cloneValue(cell);
    put.addColumn(family.getBytes(), column.getBytes(), value);
  }
  tablePut.put(put);
}

1 Ответ

0 голосов
/ 25 сентября 2018

Вы можете поместить записи с метками времени в обратном порядке, следуя 2 подходам:

  1. Поместите строку в HBase с явными значениями меток времени.

Выполнение установки всегда создаетновая версия ячейки, в определенное время.По умолчанию система использует currentTimeMillis, но вы можете сами указать отметку времени (= длинное целое) на уровне столбцов.Это означает, что вы можете назначить время в прошлом или будущем или использовать длинное значение для не временных целей.

Инициализировать значение метки времени как:

long timestamp = Long.MAX_VALUE - System.currentTimeMillis()
Put put = new Put(Bytes.toBytes(rowKey), timestamp);
put.add(Bytes.toBytes(family), Bytes.toBytes(qualifier), Bytes.toBytes(value.toString()));
table.put(put);

Ссылка: https://hbase.apache.org/1.1/apidocs/org/apache/hadoop/hbase/client/Put.html#Put(byte[],%20long) https://www.ngdata.com/bending-time-in-hbase/

Используйте Hashmap с Key как: строка "family_column" (семейство столбцов и имя столбца, объединенные с '|' или '_') и значение LinkedList значений.

HashMap<String, LinkedList> values = new HashMap<String, LinkedList>()

Вставьте значения в виде LinkedList с ключом.После цикла for выполните итерацию HashMap и для каждого элемента в HashMap получите значение, которое является LinkedList, и переверните LinkedList, используя:

Collections.reverse(list)

Теперь выполните итерацию по перевернутому списку и поместите элементы в HBase.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...