HBase数据结构

HBase数据模型

HBase和传统的数据库有很大的不同之处,比如MySQL,PostGreSQL,Oracle等

设计hbase的表和传统关系数据库非常不同

一个key-value存储结构的
或者说是面向列族的数据库
多版本映射的数据库

HBase数据结构_表结构

行(Row)
在表中数据依赖于行来存储,行通过行键来区分。行键没有数据类型,通常是一个字节数组。

列族(Column Family)
行中的数据通过列族来组织。列族也暗示了数据的物理排列。所以列族必须预先定义,并且不容易被修改。每行都拥有相同的列族,可能有些行的数据为空。列族是字符串和字符的组合,可以在文件系统路径
中使用。

列标识(Column Qualifier)
数据在列族中的位置是通过列标识来指定的。列标识不需要预先指定,每行的列标识也不需要相同。就像行键一样,列标识没有数据类型,通常也是字节数组。

单元(Cell)
单元是行键、列族、列标识的组合。这些数据存储在单元中,被称作单元数据。数据也不需要数据类型,通常也是字节数组。

时间戳(Timestamp)
单元数据是有版本的。版本的区分就是他们的版本号,版本号默认就是时间戳。当写入数据时,如果没有指定时间,那么默认的时间就是系统的当前时间。读取数据的时候,如果没有指定时间,那么返回的就是最新的数据。保留版本的数量根据每个列族的配置。默认的版本数量是3。

HBase数据结构_表结构

表包含两个列族,personal和office。每个列族都有两列。每个方格就是一个单元,行键根据字母顺序进行排序。

这些概念也通过API方式暴露给客户端。hbase的API数据管理包含三个主要方法:get,put和scan。get和put方法需要制定行键,scan操作是浏览一定范围的行。范围可以通过开始和结束的行键来指定。如果不指定那么就是浏览整个表数据。有时候,使用多维映射来理解数据模型可能更简单。多维映射就像下图所示

HBase数据结构_表结构_03

可以使用键值的方式来理解,键就是行键,值就是列中的值,但是给定一个行键仅仅能确定一行的数据。你可以把行键,列族,列标识,时间戳都看做键。而值就是单元中的数据

HBase数据结构_版本号_04

多版本(version)数据获取办法

当想要用HBase存储历史几个版本的数据是 (达到类似于git的效果时)可以设定版本号,
版本号为几 就是存储几个版本的数据

create ‘表名’,{NAME=‘列族名1’,VERSIONS=给定一个版本号},{NAME=‘列族名2’,VERSIONS=给定的版本号}
1、在shell端创建一个Hbase表:

create 't1','f1'

2、查看表结构

describe 't1'

表结构如下:

{NAME => 'f1', BLOOMFILTER => 'ROW', VERSIONS => '1',... 

从上面的表结构中,我们可以看到,VERSIONS为1,也就是说,默认情况只会存取一个版本的列数据,当再次插入的时候,后面的值会覆盖前面的值。

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

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

修改后,再次查看表结构:

{NAME => 'f1', BLOOMFILTER => 'ROW', VERSIONS => '3',...

发现VERSIONS已经修改成了3.

4、插入3行数据

put 't1' ,'rowkey1','f1:name','A'
put 't1' ,'rowkey1','f1:name','B'
put 't1' ,'rowkey1','f1:name','C'

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

5、获取多行数据方法

get 't1' ,'rowkey1',{COLUMN=>'f1:name',VERSIONS=>3}

从上面的测试结果中,可以看出,一次性获取了3个版本的数据。

COLUMN                          CELL                                                                                     
f1:name timestamp=1618813169582, value=C
f1:name timestamp=1618813164775, value=B
f1:name timestamp=1618813157388, value=A
1 row(s) in 0.1390 seconds