HBase本身作为数据库,提供了完整的增删改查的功能。HBase基于HDFS来进行存储,HDFS的特点是允许一次写入多次读取,不允许修改而允许追加写入,但HBase提供了”改“功能,HBase如何实现”改“功能的?-HBase实际上并没有去修改写入的数据,而是在文件末尾去追加数据,HBase会对写入的每条数据自动添加一个时间戳,当用户获取数据的时候,HBase自动返回最新的数据,那么从用户角度来看,就是发生了数据的修改。
在HBase中,数据的每一个时间戳称之为一个版本
如果要锁定唯一的一条数据,那么需要通过行键+列族+列+时间戳这四个维度来锁定,这种结构称为一个cell(单元格)
HBase中的表在创建的时候,如果不指定,那么只对外提供一个版本的数据
如果建好表之后再修改可以获取的版本,那么已经添加的数据不起作用
即使表允许对外获取多个版本的数据,在获取的时候如果不指定,依然只获取一个版本的数据
举例,修改数据
put 'userinfo','u1','basic:age',31
put 'userinfo','u1','basic:age',32
put 'userinfo','u1','basic:age',333
put 'userinfo','u1','basic:age',33
put 'userinfo','u1','basic:age',34
put 'userinfo','u1','basic:age',35
put 'userinfo','u1','basic:age',36
当我执行
get 'userinfo','u1',{COLUMN => 'basic:age', VERSIONS => 3}
发现只有一个版本,因为要制定版本数需要在建表时指定
create 'userinfo2', {NAME => 'basic', VERSIONS => 3}, {NAME => 'info', VERSIONS => 4}
指定每一个列族允许对外获取的版本数量
使用desc查看表
desc 'userinfo2' 或者 describe 'userinfo2' | 描述表 |
表信息如下
插入数据如下
得到指定版本的数据
get 'userinfo2', 'u1', {COLUMN => 'basic:age', VERSIONS => 3}
可以看到获得了三个版本的数据
get 'userinfo2', 'u1', {COLUMN => 'basic:age', VERSIONS => 4},仍然不起作用
get 'userinfo2', 'u1', {COLUMN => 'info:height', VERSIONS => 4},获得info族 height 4个版本的数据
获取指定列的指定数量版本的数据
put 'userinfo2','u2','basic:age',70
put 'userinfo2','u2','basic:age',71
put 'userinfo2','u2','basic:age',72
put 'userinfo2','u2','basic:age',73
put 'userinfo2','u2','basic:age',74
put 'userinfo2','u2','basic:age',75
scan 'userinfo2', {COLUMNS => 'basic:age', VERSIONS => 3}