NoSQL-Column-HBase数据模型
RDBS是行数据库,数据是按表一行一行进行存储的。HBase是列数据库,存储是按列来存储的(准确点应该是按照列簇来存储的)。谈到列库就不得不说Google的BigTable,HBase的数据模型和BigTable的数据模型相似的,HBase是它的开源版本而已。表是由行和列构成,行列的交叉点在RDBS是一个属性,在HBase中称为Cell。并且HBase的cell是版本化的。cell的内容是不可分割的字节数组。我们用{row,column,version}来表示一个Cell。 我们将Cell看成一个三元组,不同的row和column可以构成一个新Cell,version不同可以构成一个新的Cell。row和column一般是固定的,version是不断变化的。所以我们有理由相信HBase数据存储的方式是由row和column确定的。这只是一个猜测了,下面在看HBase实际的视图。
概念视图下面是HBase的例子。 有一个名为webtable的表,包含两个列族:contents和anchor。在这个例子里面,anchor有两个列 (anchor:cssnsi.com,anchor:my.look.ca),contents仅有一列(contents:html)。每个列有一个,它是可以重复的。 webtable
表是HBase的基本管理单元,表按Row排序的。表的Schema只定义它的列簇。每个列簇可以有任意多个列;每个列可以包含任意多版本;没有插入过数据的列是空;列簇中的列是排序过的,并且一起存储。
|
Row Key | Time Stamp | Column Familyanchor |
---|---|---|
"com.cnn.www" | t9 | anchor:cnnsi.com= "CNN" |
"com.cnn.www" | t8 | anchor:my.look.ca= "CNN.com" |
ColumnFamilycontents
Row Key | Time Stamp | ColumnFamily "contents:" |
---|---|---|
"com.cnn.www" | t6 | contents:html= "<html>..." |
"com.cnn.www" | t5 | contents:html= "<html>..." |
"com.cnn.www" | t3 | contents:html= "<html>..." |
可以再简化一下((Row,Family: Column,Timestamp)=Value):
Row Key |
ColumnFamily |
key |
<Time Stamp,ColumnFamily: qualifier =vlaue> |
为什么将TimeStamp独立存储为一个列呢?时间戳是用户查询指定的,将时间戳独立存储,可以加快数据访问处理的速度。
对于用户的查询,如果指定了时间戳,HBase返回指定Row Key&Column和Time Stamp对应的列值。否则选取指定 Row Key&Column中版本最高的Time Stamp的列值。如果没有指定列,则返回行键的所有满足条件的列值。例如,如果请求为获取行键为"com.cnn.www",没有指明时间戳的话,结果是t6下的contents:html,t9下的anchor:cnnsi.com和t8下anchor:my.look.ca。
数据模型操作
四个主要的数据模型操作是 Get,Put,Scan,和 Delete,仅能通过主键(row key)和主键的range来检索数据,通过HTable实例进行操作。没有更新操作,并且Delete也不是真正的删除,而是做一个标记,在表的合并拆分的时候处理。
Get,和 Delete操作可以通过HBase Shell和Java代码(REST,Thrift API)来进行。下面两个链接给出了简单是实例
http://blog.pureisle.net/archives/1887.html
http://blog.csdn.net/javaman_chen/article/details/7220216
HBase不通过Join支持,也没有事务支持,只是在行操作上有锁。
对于习惯了SQL操作的人来说,HBase自身并没有提供SQL支持,不过有一些开源项目可以提供,比如http://code.google.com/p/hbase-sql/。它们在一定程度上可以简化数据查询。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!