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插入数据的时候设置自定义的时间戳
立志如山 静心求实
浙公网安备 33010602011771号