检索Hbase版本化数据

时间:2016-02-17 15:20:19

标签: hive hbase

我正在尝试检索不同版本的Hbase数据。

步骤1 - 表abc有4列,全部为版本1和单列族。

a b c d

1 1 1 1

步骤2 - 列b和c值发生变化,我们将列b和c的更新值加载为版本2.(列b和c具有版本1和版本2数据)

a b c d

1 1/2 1/2 1

我想从Hbase中检索以下版本。

a b c d

1 1 2 1

有没有办法实现这个目标?

提前致谢。

1 个答案:

答案 0 :(得分:1)

HBase在这个概念上有很好的documentation

  

为给定列存储的最大版本数是列模式的一部分,并在创建表时指定,或通过alter命令通过HColumnDescriptor.DEFAULT_VERSIONS指定。在HBase 0.96之前,保留的默认版本数为3,但是在0.96中,更新版本已更改为1.

因此,如果您现在正在设计架构,则可以设置存储特定数量的先前版本。如果HBase表已经存在,您可以对其进行更改,但无法获取已存储数据的先前版本。

以下是获取列的先前版本的示例(来自该文档):

public static final byte[] CF = "cf".getBytes();
public static final byte[] ATTR = "attr".getBytes();
...
Get get = new Get(Bytes.toBytes("row1"));
get.setMaxVersions(3);  // will return last 3 versions of row
Result r = table.get(get);
byte[] b = r.getValue(CF, ATTR);  // returns current version of value
List<KeyValue> kv = r.getColumn(CF, ATTR);  // returns all versions of this column

请务必记住,从HBase的角度来看,版本与写入时使用的时间戳直接相关。默认的put命令将使用其执行时间作为其时间戳。所以通常这会根据我们的更改提供版本控制。但是,如果两个put操作的时间戳T1T2 T1小于T2,那么T1实际上是在之后写的 / em> T2,它仍将显示为早期版本。它是HBase关心的时间戳,而不是在绝对时间它实际写入的时间。这使得例如可以通过设置相同的时间戳来覆盖早期版本。