在学习HBase的表结构之前,首先需要了解一下什么是Google的BigTable思想。视频讲解如下:
BigTable大表的思想是Google的“第三驾马车”。正因为有了这样的思想就有了Hadoop生态圈体系中的NoSQL数据库HBase。
提示:NoSQL数据库泛指所有的非关系型数据库。NoSQL数据库有很多种,比如:Hadoop体系中的HBase;基于内存的Redis和基于文档的MongoDB。而NoSQL数据库从某种程度上说也是属于大数据体系中的组成部分。
那么什么是BigTable大表呢?简单来说就是把所有的数据存入一张表中,这样做的目的就是为了提高查询的性能。但是这也将违背关系型数据库范式的要求。在关系型数据库中需要遵循范式的要求来减少数据的冗余。减少数据冗余的好处是节约了存储的空间,但是会影响性能。例如:在关系型数据库中执行多表查询会产生笛卡尔积。因此,关系型数据库的出发点是通过牺牲性能,达到节约存储空间的目的。这样设计是有实际意义的,因为在早些年的时候,存储的介质是比较昂贵的,需要考虑成本的问题。而大表的思想正好与其相反,它是把所有的数据存入一张表中。大表的思想是通过牺牲存储空间来达到提高查询性能的目的。
下图展示了在关系型数据库中的表结构。这里的关系型数据库可以是Oracle、MySQL等等。下图的数据模型是部门-员工,即:一个部门可能包含多个员工,一个员工只属于一个部门。
HBase就是BigTable大表思想的一个具体实现,并且它是一个列式存储的NoSQL数据库适合执行数据的分析和处理。简单来说就是适合执行查询操作。如果把上图中的部门-员工数据存入HBase的表中,那将会是什么样的呢?下图展示了HBase的表结构。
HBase的表由列族组成,上图的“emp”和“dept”都是列族,列族中包含列。创建表的时候必须创建列族,不需要创建列。当执行插入语句插入数据到列族中的时候,需要指定rowkey和具体的列。如果列不存在,HBase会自动创建相应的列,再把数据插入到对应的单元格上。
提示:rowkey相当于关系型数据库的主键。但是与主键不同的是,rowkey与关系型数据库类似不允许为空,但是可以重复的。如果rowkey重复了,表示相同的rowkey是同一条记录。
例如,如果要得到上图所示的表结构和数据,可以在HBase中执行下面的语句。
# 创建employee表,包含两个列族:emp和dept create 'employee','emp','dept' # 插入数据 put 'employee','7839','emp:ename','KING' put 'employee','7839','emp:job','PRESIDENT' put 'employee','7839','emp:hiredate','17-11月-81' put 'employee','7839','emp:sal','5000' put 'employee','7839','dept:deptno','10' put 'employee','7839','dept:dname','ACCOUNTING' put 'employee','7839','dept:loc','NEW YORK'
下图展示了在HBase Shell的命令中执行的效果。