Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
hbase中是否有最大版本号?_Hbase - Fatal编程技术网

hbase中是否有最大版本号?

hbase中是否有最大版本号?,hbase,Hbase,如果要在表中插入: row | fam:qualifier | timestamp | value 1 | foo:bar | 12345 | 2 1 | foo:bar | 12346 | 3 1 | foo:bar | 12347 | 2 1 | foo:bar | 12348 | 1 . . . 1 | foo:bar | 123410 | 2 我可以在hbase shell中指定要获取特定行的最大版本数,但当我指定例如“100”时,它只返回4个版本。。。 是否有最大值?它只返回4个版

如果要在表中插入:

row | fam:qualifier | timestamp | value
1 | foo:bar | 12345 | 2
1 | foo:bar | 12346 | 3
1 | foo:bar | 12347 | 2
1 | foo:bar | 12348 | 1
.
.
. 
1 | foo:bar | 123410 | 2
我可以在hbase shell中指定要获取特定行的最大版本数,但当我指定例如“100”时,它只返回4个版本。。。
是否有最大值?

它只返回4个版本,因为列族设置为最多存储4个版本

如果要存储更多版本,则需要使用hbase外壳更改CF:

hbase> alter 'table_foo', {NAME => 'column_fam_foo', VERSIONS => 100}
最大版本的默认值为1*:


*max版本的默认值似乎在某个时候从3更改为1。

答案部分正确。不正确:hbase存储三个版本。证据见下文。 True:您可以设置hbase通过返回的最大版本数

alter 'marketdata', NAME => 'field', VERSIONS => 100   
但是现在让我们假设,我没有更改版本变量

我的hbase中有十个条目,时间戳从0到9。 最新的时间戳是:

hbase(main):025:0> get 'marketdata', 'instrument1', {COLUMN => 'field:ask'}                                 
COLUMN                             CELL                                                                                   
 field:ask                     timestamp=9,         value=0.9940174211042572                                                  
1 row(s) in 0.0590 seconds

hbase(main):026:0> 
显示的时间戳1到5之间的值为:

hbase(main):027:0> get 'marketdata', 'instrument1', {COLUMN => 'field:ask', TIMERANGE => [0,5], VERSIONS=>5}
COLUMN                             CELL                                                                                   
 field:ask                     timestamp=4, value=0.530618878519702                                                   
 field:ask                     timestamp=3, value=0.051028316270589014                                                
 field:ask                     timestamp=2,     value=0.11949750640509116                                                 
3 row(s) in 0.0130 seconds

hbase(main):028:0>
。。。当我将结束时间戳设置为10时,它仍然只显示该时间戳之前的最后三个版本,并抑制前三个版本:

hbase(main):028:0> get 'marketdata', 'instrument1', {COLUMN => 'field:ask', TIMERANGE => [0,10], VERSIONS=>5}
COLUMN                             CELL                                                                                   
 field:ask                     timestamp=9,     value=0.9940174211042572                                                  
 field:ask                     timestamp=8,     value=0.6941263513176372                                                  
 field:ask                     timestamp=7,     value=0.1814043435754933                                                  
3 row(s) in 0.0400 seconds

hbase(main):029:0> 

版本的概念在列族级别得到严格维护。这是一个可配置的参数

            columnFamily.setMaxVersions(required version);
版本越多,从多个HFiles读取数据的机会也就越大


最好的方法是保持最低版本并将数据封装在一个blob中

等等,如果hbase只存储3个版本,那么如何查看版本4、3、2和9、8、7?不管出于什么原因,shell可能只返回了3,但是您似乎已经“证明”了还有更多版本。真正的答案也更复杂,因为hbase删除版本的方式:它实际上并没有。如果显式删除数据,它将添加一个墓碑,并且在墓碑之前不会看到任何数据。所有其他数据都将可用(并且所有数据都将被存储),直到下一次主要压缩,该压缩将重写存储文件并只保留正确的版本数。嗨,David,你根据codingFoo编辑的回复投了反对票。这个答案仍然有点误导。您缺少的是压缩问题。当HBase存储一个值时,它只是将其附加到文件中。它从不删除数据。为了实现delete,他们附加了一个墓碑,本质上说应该忽略一个值。现在,当压缩发生时,文件将被重新写入,旧版本或删除的版本都不会被重写为新文件。因此,当您能够看到旧版本时,有一个时间窗口,但该时间窗口是有限的,您不应该依赖旧版本。