对HBase表结构及数据模型的理解

HBase表格结构

HBase的表格中涉及到几个概念,用一个例子来解释,这一部分看了很多博客,其中HBase概念及表格设计解释得很通俗,可以看一下。

HBase中一个可能的表格如下,包括:

RowKey:行键,类似关系表中的主键,是用来表示唯一一行记录的主键,按字典序排列
Column:列,类似关系表中的列,在下图中的列就是Gender,Age,Province,City
ColumnFamily:列族,是列的集合,不同的列族存储在不同文件中,引入这个概念是因为HBase查询中,很多情况下不需要一行中所有的列
Cell:单元格,由【RowKey、Column】确定的单元格,如下图中的Male,20…
TimeStamp:数据修改时加入的时间戳,下图中作为单独一列,实际上这个值是存放在单元格中的,见下面的例子
在这里插入图片描述
实际:
在这里插入图片描述
表在HBase中的逻辑表示如下,一个单元格包含数据的若干个版本,是【时间戳:值】的列表
在HBase中不同的列族存储在不同文件中,同一列族的数据在存储介质上连续
比如上面的表,在HBase中存储大致如下:
Mike - BasicInfo:Gender - T1:Male
Mike - BasicInfo:Age - T1:20
Mike - BasicInfo:Age - T3:21
Amy - BasicInfo:Gender - T2:Female
Amy - BasicInfo:Age - T2:18
Mike - AddressInfo:Province - T1:GuangDong
Mike - AddressInfo:City - T1:Guangzhou
Amy - AddressInfo:Province - T2:GuangDong
Amy - AddressInfo:City - T2:Shenzhen

参考:https://blog.csdn.net/qq_36153312/article/details/90704549

①关系型数据库的表结构

例如有一个用户表user_info,有字段:id、name、tel,表名和字段需要在建表时指定
create table user_info (

id 类型,

name 类型,

tel 类型

)
然后插入两条数据
insert into user_info values(…)
表结构如下:
在这里插入图片描述
以后再增加需求时,就需要继续新增字段。

上面的内容主要说明的是:

建表的方式,需提前指定表名和字段
插入记录的方式,指定表名和各字段的值
数据表是二维结构,行和列
添加字段不灵活

下面看一下HBase的处理方式

②HBase的表结构
建表时要指定的是:表名、列族
建表语句:create ‘user_info’, ‘base_info’, ‘ext_info’
意思是新建一个表,名称是user_info,包含两个列族base_info和ext_info
列族 是列的集合,一个列族中包含多个列
这时的表结构:
在这里插入图片描述
row key 是行键,每一行的ID,这个字段是自动创建的,建表时不需要指定,也不需要创建

插入一条用户数据:name为‘a’,tel为‘123’
插入语句
put ‘user_info’, ‘row1’, ‘base_info:name’, ‘a’
put ‘user_info’, ‘row1’, ‘base_info:tel’, ‘123’
意思是向user_info表中行健为row1的base_info列族中添加一项数据 name:a,接着又添加一项数据tel:123
name和tel就是具体字段,属于base_info这个列族
这时的表结构:
在这里插入图片描述
小结
从上面建表、插入数据的过程可以看出 HBase 存储数据的特点了
和关系数据库一样,也是使用行和列的结构
建表时,定义的是表名和列族(字段的集合),而不是具体字段
列族中可以包含任意个字段,字段名不需要预定义,每一行中同一列族中的字段也可以不一致
多维结构,关系数据库的表是二维的,通过指行、列定位一个数据,HBase中需要通过 行健、列族名、字段名、版本号才能定位到具体数据
插入数据时,一次插入一个字段的数据,不是像关系数据库那样一次插入多个字段

语法

下面给出一些语句仅供参考:
创建user表,包含info、data两个列族
create 'user', 'info1', 'data1'
create 'user', {NAME => 'info', VERSIONS => '3'}

向user表中插入信息,row key为rk0001,列族info中添加name列标示符,值为zhangsan
put 'user', 'rk0001', 'info:name', 'zhangsan'

向user表中插入信息,row key为rk0001,列族info中添加gender列标示符,值为female
put 'user', 'rk0001', 'info:gender', 'female'

向user表中插入信息,row key为rk0001,列族info中添加age列标示符,值为20
put 'user', 'rk0001', 'info:age', 20

向user表中插入信息,row key为rk0001,列族data中添加pic列标示符,值为picture
put 'user', 'rk0001', 'data:pic', 'picture'

获取user表中row key为rk0001的所有信息
get 'user', 'rk0001'

获取user表中row key为rk0001,info列族的所有信息
get 'user', 'rk0001', 'info'

获取user表中row key为rk0001,info列族的name、age列标示符的信息
get 'user', 'rk0001', 'info:name', 'info:age'

获取user表中row key为rk0001,info、data列族的信息
get 'user', 'rk0001', 'info', 'data'
get 'user', 'rk0001', {COLUMN => ['info', 'data']}
get 'user', 'rk0001', {COLUMN => ['info:name', 'data:pic']}

获取user表中row key为rk0001,列族为info,版本号最新5个的信息
get 'people', 'rk0002', {COLUMN => 'info', VERSIONS => 2}
get 'user', 'rk0001', {COLUMN => 'info:name', VERSIONS => 5}
get 'user', 'rk0001', {COLUMN => 'info:name', VERSIONS => 5, TIMERANGE => [1392368783980, 1392380169184]}

获取user表中row key为rk0001,cell的值为zhangsan的信息
get 'people', 'rk0001', {FILTER => "ValueFilter(=, 'binary:图片')"}

获取user表中row key为rk0001,列标示符中含有a的信息
get 'people', 'rk0001', {FILTER => "(QualifierFilter(=,'substring:a'))"}
put 'user', 'rk0002', 'info:name', 'fanbingbing'
put 'user', 'rk0002', 'info:gender', 'female'
put 'user', 'rk0002', 'info:nationality', '中国'
get 'user', 'rk0002', {FILTER => "ValueFilter(=, 'binary:中国')"}

查询user表中的所有信息
scan 'user'

 

查询user表中列族为info的信息
scan 'people', {COLUMNS => 'info'}
scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 5}
scan 'persion', {COLUMNS => 'info', RAW => true, VERSIONS => 3}

查询user表中列族为info和data的信息
scan 'user', {COLUMNS => ['info', 'data']}
scan 'user', {COLUMNS => ['info:name', 'data:pic']}

查询user表中列族为info、列标示符为name的信息
scan 'user', {COLUMNS => 'info:name'}

 

查询user表中列族为info、列标示符为name的信息,并且版本最新的5个
scan 'user', {COLUMNS => 'info:name', VERSIONS => 5}

 

查询user表中列族为info和data且列标示符中含有a字符的信息
scan 'people', {COLUMNS => ['info', 'data'], FILTER => "(QualifierFilter(=,'substring:a'))"}

 

查询user表中列族为info,rk范围是[rk0001, rk0003)的数据
scan 'people', {COLUMNS => 'info', STARTROW => 'rk0001', ENDROW => 'rk0003'}

 

查询user表中row key以rk字符开头的
scan 'user',{FILTER=>"PrefixFilter('rk')"}

 

查询user表中指定范围的数据
scan 'user', {TIMERANGE => [1392368783980, 1392380169184]}

 

禁用表
disable 'user' 将数据表设置为失效

 

删除表
drop 't_user' 删除数据表 删除前必须使其失效

 

启用表

enable 't_user' 将数据表设置为有效

 

查看表结构

desc 't_user' 查看数据表结构

 

删除user表row key为rk0001,列标示符为info:name的数据

delete 'people', 'rk0001', 'info:name'

删除user表row key为rk0001,列标示符为info:name,timestamp为1392383705316的数据

delete 'user', 'rk0001', 'info:name', 1392383705316

 

清空user表中的数据

truncate 'people'

参考:https://www.cnblogs.com/supiaopiao/p/7270592.html

HBase表特点

数据规模大,单表可容纳数十亿行,上百万列。
无模式,不像关系型数据库有严格的Scheme,每行可以有任意多的列,列可以动态增加,不同行可以有不同的列,列的类型没有限制。
稀疏,值为空的列不占存储空间,表可以非常稀疏,但实际存储时,能进行压缩。
面向列族,面向列族的存储和权限控制,支持列族独立查询。
数据多版本,利用时间戳来标识版本
数据无类型,所有数据以字节数据形式存储

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值