对于hbase表'test_table'的示例,插入的值为:
Row1 - Val1 => t
Row1 - Val2 => t + 3
Row1 - Val3 => t + 5
Row2 - Val1 => t
Row2 - Val2 => t + 3
Row2 - Val3 => t + 5
Run Code Online (Sandbox Code Playgroud)
扫描'test_table'时应返回version = t + 4
Row1 - Val1 => t + 3
Row2 - Val2 => t + 3
Run Code Online (Sandbox Code Playgroud)
如何在HBase中实现基于时间戳的扫描(基于最新可用值小于或等于时间戳)?
0x0*_*FFF 33
考虑一下这个表:
hbase(main):009:0> create 't1', { NAME => 'f1', VERSIONS => 100 }
hbase(main):010:0> put 't1', 'key1', 'f1:a', 'value1'
hbase(main):011:0> put 't1', 'key1', 'f1:a', 'value2'
hbase(main):012:0> put 't1', 'key1', 'f1:a', 'value3'
hbase(main):013:0> put 't1', 'key2', 'f1:a', 'value4'
hbase(main):014:0> put 't1', 'key2', 'f1:a', 'value5'
hbase(main):015:0> put 't1', 'key1', 'f1:a', 'value6'
Run Code Online (Sandbox Code Playgroud)
这是在shell中扫描所有版本:
hbase(main):003:0> scan 't1', {VERSIONS => 100 }
ROW COLUMN+CELL
key1 column=f1:a, timestamp=1416083314098, value=value6
key1 column=f1:a, timestamp=1416083294981, value=value3
key1 column=f1:a, timestamp=1416083293273, value=value2
key1 column=f1:a, timestamp=1416083291009, value=value1
key2 column=f1:a, timestamp=1416083305050, value=value5
key2 column=f1:a, timestamp=1416083299840, value=value4
Run Code Online (Sandbox Code Playgroud)
根据您的要求,此扫描仅限于特定时间戳:
hbase(main):002:0> scan 't1', { TIMERANGE => [0, 1416083300000] }
ROW COLUMN+CELL
key1 column=f1:a, timestamp=1416083294981, value=value3
key2 column=f1:a, timestamp=1416083299840, value=value4
Run Code Online (Sandbox Code Playgroud)
以下是Java代码中的相同内容:
package org.example.test;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
public class test {
public static void main (String[] args) throws IOException {
HTable table = new HTable(HBaseConfiguration.create(), "t1");
Scan s = new Scan();
s.setMaxVersions(1);
s.setTimeRange (0L, 1416083300000L);
ResultScanner scanner = table.getScanner(s);
for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {
System.out.println(Bytes.toString(rr.getRow()) + " => " +
Bytes.toString(rr.getValue(Bytes.toBytes("f1"), Bytes.toBytes("a"))));
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,排除指定时间范围最大值,这意味着如果要获取具有最大时间戳T的所有键的最后一个值,则应指定范围的上限为T + 1
| 归档时间: |
|
| 查看次数: |
30848 次 |
| 最近记录: |