基于Java中的时间戳获取HBase表行

时间:2014-11-28 13:19:37

标签: java hadoop hbase

我已经在HBase工作了几个星期。我的问题是:

我有一个包含100条记录的HBase表,每条记录在一个列族中有三列,并且只有一个列族。现在我想根据时间戳检索行。表示应该首先检索最后添加的行。就像(LIFO)。现在这个功能在HBase中可用吗?如果是,那我该怎么办?我使用的是0.98.3。

注意:插入数据时,我没有手动提及时间戳。

我试图用Java语言来做。

此致

1 个答案:

答案 0 :(得分:0)

行按字典顺序按行键(升序)排序,执行全表扫描时根本不涉及时间戳,检索到的第一行将是最低行。

这是字符串行键的顺序:

STRING  ROW
0       \x30
00      \x30\x30
0000    \x30\x30\x30\x30
0001    \x30\x30\x30\x31
0002    \x30\x30\x30\x32
...
0010    \x30\x30\x31\x30
1       \x31
10      \x31\x30
2       \x32
a       \x61
ab      \x61\x62
...
zzzz    \x7A\x7A\x7A\x7A

这是4字节有符号整数行键的顺序:

INT     ROW
1       \x00\x00\x00\x01
2       \x00\x00\x00\x02
3       \x00\x00\x00\x03
4       \x00\x00\x00\x04
...
100     \x00\x00\x00\x64
...
10000   \x00\x00\x27\x10
...
MAX_INT \x7F\xFF\xFF\xFF

如果您需要将扫描作为LIFO工作,则必须将反转时间戳作为rowkey的前缀(尽管由于热点而不建议用于重写环境)。

byte[] rowKey = Bytes.add( Byte.toBytes( Long.MAX_VALUE - System.currentTimeMillis() ), "-myRow".getBytes());

如果您不反转时间戳,它将作为LILO。

有关更多信息,请查看HBase Book的这一部分:https://hbase.apache.org/book/rowkey.design.html