Hbase:简单介绍⼀下Hbase表的结构
HBase 是⼀个NoSQL数据库,⽤于处理海量数据,可以⽀持10亿⾏百万列的⼤表,下⾯我就和⼤家分享⼀下数据是如何存放在HBase表中的
为了更好的理解HBase表的思路,先回顾⼀下关系数据库中表的处理⽅式
①关系型数据库的表结构
例如有⼀个⽤户表user_info,有字段:id、name、tel,表名和字段需要在建表时指定
create table user_info (
id 类型,
name 类型,
tel 类型
)
然后插⼊两条数据
insert into user_info values(...)
表结构如下:
id name tel
1苏静139********
2王荣荣132********
后来字段不够⽤了,⽤户需要添加地址,就要新增⼀个字段,如下:
id name tel address
1苏静139********...
2王荣荣132********...hbase属于什么数据库
以后再增加需求时,就需要继续新增字段。
上⾯的内容主要说明的是:
建表的⽅式,需提前指定表名和字段
插⼊记录的⽅式,指定表名和各字段的值
数据表是⼆维结构,⾏和列
添加字段不灵活
下⾯看⼀下HBase的处理⽅式
②HBase的表结构
建表时要指定的是:表名、列族
建表语句:create 'user_info', 'base_info', 'ext_info'
意思是新建⼀个表,名称是user_info,包含两个列族base_info和ext_info
列族是列的集合,⼀个列族中包含多个列
这时的表结构:
row key(⾏键)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这个列族
这时的表结构:
row key(⾏键)base_info(列族)ext_info(列族)
row1name:a, tel:123
再插⼊⼀条数据:name为‘b’,addr为‘beijing’
put 'user_info', 'row2', 'base_info:name', 'b'
put 'user_info', 'row2', 'ext_info:addr', 'bj'
这时的表结构:
row key(⾏键)base_info(列族)ext_info(列族)
row1name:a, tel:123
row2name:b addr:bj
HBase表中还有⼀个重要概念:版本,每个字段的值都有版本信息(通过时间戳指定)
例如 base_info:name,每次修改时都会保留之前的值,就是说可以取到他的旧值
row key base_info ext_info
row1name:a, tel:123
row2name:c(v2)[name:b(v1)]addr:bj
⼩结
从上⾯建表、插⼊数据的过程可以看出 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'
如果您认为这篇⽂章还不错或者有所收获,您可以通过右边的“打赏”功能打赏我⼀杯咖啡【物质⽀持】,也可以点击下⽅的【好⽂要顶】按钮【精神⽀持】,因为这两种⽀持都是使我继续写作、分享的最⼤动⼒!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。