HBase数据结构
HBase数据模型
HBase和传统的数据库有很大的不同之处,比如MySQL,PostGreSQL,Oracle等
设计hbase的表和传统关系数据库非常不同
一个key-value存储结构的
或者说是面向列族的数据库
多版本映射的数据库
行(Row)
在表中数据依赖于行来存储,行通过行键来区分。行键没有数据类型,通常是一个字节数组。
列族(Column Family)
行中的数据通过列族来组织。列族也暗示了数据的物理排列。所以列族必须预先定义,并且不容易被修改。每行都拥有相同的列族,可能有些行的数据为空。列族是字符串和字符的组合,可以在文件系统路径
中使用。
列标识(Column Qualifier)
数据在列族中的位置是通过列标识来指定的。列标识不需要预先指定,每行的列标识也不需要相同。就像行键一样,列标识没有数据类型,通常也是字节数组。
单元(Cell)
单元是行键、列族、列标识的组合。这些数据存储在单元中,被称作单元数据。数据也不需要数据类型,通常也是字节数组。
时间戳(Timestamp)
单元数据是有版本的。版本的区分就是他们的版本号,版本号默认就是时间戳。当写入数据时,如果没有指定时间,那么默认的时间就是系统的当前时间。读取数据的时候,如果没有指定时间,那么返回的就是最新的数据。保留版本的数量根据每个列族的配置。默认的版本数量是3。
表包含两个列族,personal和office。每个列族都有两列。每个方格就是一个单元,行键根据字母顺序进行排序。
这些概念也通过API方式暴露给客户端。hbase的API数据管理包含三个主要方法:get,put和scan。get和put方法需要制定行键,scan操作是浏览一定范围的行。范围可以通过开始和结束的行键来指定。如果不指定那么就是浏览整个表数据。有时候,使用多维映射来理解数据模型可能更简单。多维映射就像下图所示
可以使用键值的方式来理解,键就是行键,值就是列中的值,但是给定一个行键仅仅能确定一行的数据。你可以把行键,列族,列标识,时间戳都看做键。而值就是单元中的数据
多版本(version)数据获取办法
当想要用HBase存储历史几个版本的数据是 (达到类似于git的效果时)可以设定版本号,
版本号为几 就是存储几个版本的数据
create ‘表名’,{NAME=‘列族名1’,VERSIONS=给定一个版本号},{NAME=‘列族名2’,VERSIONS=给定的版本号}
1、在shell端创建一个Hbase表:
2、查看表结构
表结构如下:
从上面的表结构中,我们可以看到,VERSIONS为1,也就是说,默认情况只会存取一个版本的列数据,当再次插入的时候,后面的值会覆盖前面的值。
3、修改表结构,让Hbase表支持存储3个VERSIONS的版本列数据
修改后,再次查看表结构:
发现VERSIONS已经修改成了3.
4、插入3行数据
从上面可以看出,插入了3行数据到表中,并且3行数据的rowkey一致,然后使用get命令来获取这一行数据,发现只返回了最新的一行数据。
5、获取多行数据方法
从上面的测试结果中,可以看出,一次性获取了3个版本的数据。