Hbase多版本

       hbase支持多版本存储,其一条数据的多版本是以timestamp来标识的。version就是同一条数据插入不同的时间戳来实现的,在hbase底层的存储是基于时间戳排序的,所以每次查到的数据都是最新的版本

  1、在shell端创建一个Hbase表

create 't1','f1'

   2、查看表结构

describe 't1'
Table t1 is ENABLED                                                                                                                   
t1                                                                                                                                    
COLUMN FAMILIES DESCRIPTION                                                                                                           
{NAME => 'f1', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NON
E', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'
}                                                                                                                                     
1 row(s) in 0.1370 seconds

  VERSIONS为1,默认情况只会存取一个版本的列数据,当再次插入的时候,后面的值会覆盖前面的值。

    3、修改表结构,让Hbase表支持存储3个VERSIONS的版本列数据

alter 't1',{NAME=>'f1',VERSIONS=>3}

  再次查看表结构:

Table t1 is ENABLED                                                                                                                   
t1                                                                                                                                    
COLUMN FAMILIES DESCRIPTION                                                                                                           
{NAME => 'f1', BLOOMFILTER => 'ROW', VERSIONS => '3', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NON
E', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'
}                                                                                                                                     
1 row(s) in 0.0330 seconds

  4、插入3行数据

hbase(main):015:0> put 't1','rowkey1','f1:name','liu'
0 row(s) in 0.5890 seconds
 
hbase(main):016:0> put 't1','rowkey1','f1:name','x123'
0 row(s) in 0.1900 seconds
 
hbase(main):017:0> put 't1','rowkey1','f1:name','liuxyh'
0 row(s) in 0.1580 seconds
 
hbase(main):018:0> get 't1','rowkey1','f1:name'
COLUMN                             CELL                                                                                               
 f1:name                           timestamp=1482820567560, value=liuxyh                                                           
1 row(s) in 0.2110 seconds

   插入3行数据到表中并且3行数据的rowkey一致,然后使用get命令来获取这一行数据,发现只返回最新的一行数据。

    5、获取多行数据方法

hbase(main):002:0> get 't1','rowkey1',{COLUMN=>'f1:name',VERSIONS=>3}
COLUMN                             CELL                                                                                               
 f1:name                           timestamp=1482820567560, value=liuxyh                                                           
 f1:name                           timestamp=1482820541363, value=x123                                                              
 f1:name                           timestamp=1482820503889, value=liu                                                              
3 row(s) in 0.0960 seconds

  在使用的时候应该注意尽量不要修改默认取当前时间戳的逻辑,如果修改了那么在其他添加,删除,更新的时候都应该考虑当前的时间戳是否大于第一次插入时的时间戳,如果不是,那么本次修改就不会生效,所以某一天当你删除一行hbase数据时,发现它并没有被删除掉,不要惊讶,在代码没有问题的情况下,最大的可能就是当前时间戳小于库里数据的时间戳,这一点需要特别注意,最后再重复一遍,尽量不要在向hbase插入数据的时候设置自定义的时间戳

posted on 2022-05-23 10:05  溪水静幽  阅读(1313)  评论(0)    收藏  举报