一.Table
传统数据库一个表的结构如下
姓名 | 年龄 | 性别 | 成绩 |
---|---|---|---|
wuyifan | 18 | man | 100 |
john | 20 | man | 98 |
转换成HBase数据库的表结构就如下所示
info | score | |
---|---|---|
Row_key | info:name ,info:age ,info:sex | score:name, score:score |
//创建表和列族//
create 'school','info','score'
//==创建列族中的列和数据//
put 'school','001','info:name','wuyifan'
put 'school','001','info:age','18'
put 'school','001','info:sex','man'
put 'school','001','score:name','wuyifan'
put 'school','001','score:score','100'
put 'school','002','info:name','john'
put 'school','002','info:age','20'
put 'school','002','info:sex','man'
put 'school','002','score:name','john'
put 'school','002','score:score','98'
二.Column Family
列族:HBASE表中的每个列,都归属于某个列族。列族是表的schema的一部 分(而列不是),必须在使用表之前定义。列名都以列族作为前缀。例如 courses:history,courses:math都属于courses 这个列族。
三.RowKey
- 单个RowKey
- RowKey的正则
- 全表扫描
RowKey行键 (RowKey)可以是任意字符串(最大长度是64KB,实际应用中长度一般为 10-100bytes),在HBASE内部,RowKey保存为字节数组。存储时,数据按照RowKey的字典序(byte order)排序存储。设计RowKey时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性)
四.Cell
由 rowkey, column Family:columu, version 他们三个参数确定唯一一个Cell
cell中的数据是没有类型的,全部是字节码形式存贮。
table 1:
table 2:
table 2 可以看出 如果时间戳在原来的时间戳之前,则数据修改不成功,反之成功,得出结论:HBase中的cell 是按版本来存储的,每个cell都有各种版本的数据,所以当update一个cell中的数据的时候,其实是网cell的末尾追加一个版本的数据,而update之前的数据依然是存在的,这和insert一个新的数据没有任何的区别,每个family都可以设置每个cell要保留的版本数量,默认是3,由VERSIONS决定。 当使用get或者scan命令查看数据时候,如果没有指定版本数则默认是只取到每个cell最新的版本的数据,如果指定了VERSIONS则显示其指定的版本数量的数据。
五.Time Stamp
HBASE 中通过rowkey和columns确定的为一个存贮单元称为cell。每个 cell都保存 着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64位整型。时间戳可以由HBASE(在数据写入时自动 )赋值,此时时间戳是精确到毫秒 的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版 本冲突,就必须自己生成具有唯一性的时间戳。每个 cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。
为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担,HBASE提供 了两种数据版本回收方式。一是保存数据的最后n个版本,二是保存最近一段 时间内的版本(比如最近七天)。用户可以针对每个列族进行设置。