Hbase按插入顺序扫描多个版本
Hbase scan multiple versions in insertion order
我想在 hbase table 上扫描 10 个版本。但是,结果按最新到最旧的顺序给我数据。我想以相反的顺序得到它。
有办法吗?
示例:
如果我按以下顺序将数据放入 'test' table 中:
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);
}
您可以按照以下 2 种方法放置具有倒序时间戳的记录:
- 将具有显式时间戳值的行放入 HBase。
执行 put 总是会在某个时间戳创建新版本的单元格。默认情况下,系统使用 currentTimeMillis,但您可以在每列级别自己指定时间戳(= 长整数)。这意味着您可以指定过去或未来的时间,或将 long 值用于非时间用途。
将时间戳值初始化为:
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/
Use Hashmap with Key as: "family_column" string (column family and column name concatenated with '|' or '_') and value值的链表。
HashMap<String, LinkedList> values = new HashMap<String, LinkedList>()
将值作为带键的 LinkedList 插入。
在 for 循环之后,迭代 HashMap 并针对 HashMap 中的每个元素,获取 LinkedList 的 Value 并使用以下方式反转 LinkedList:
Collections.reverse(list)
现在遍历反向列表并将元素放入 HBase。
我想在 hbase table 上扫描 10 个版本。但是,结果按最新到最旧的顺序给我数据。我想以相反的顺序得到它。 有办法吗?
示例:
如果我按以下顺序将数据放入 'test' table 中:
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);
}
您可以按照以下 2 种方法放置具有倒序时间戳的记录:
- 将具有显式时间戳值的行放入 HBase。
执行 put 总是会在某个时间戳创建新版本的单元格。默认情况下,系统使用 currentTimeMillis,但您可以在每列级别自己指定时间戳(= 长整数)。这意味着您可以指定过去或未来的时间,或将 long 值用于非时间用途。
将时间戳值初始化为:
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/
Use Hashmap with Key as: "family_column" string (column family and column name concatenated with '|' or '_') and value值的链表。
HashMap<String, LinkedList> values = new HashMap<String, LinkedList>()
将值作为带键的 LinkedList 插入。 在 for 循环之后,迭代 HashMap 并针对 HashMap 中的每个元素,获取 LinkedList 的 Value 并使用以下方式反转 LinkedList:
Collections.reverse(list)
现在遍历反向列表并将元素放入 HBase。