发布于 2016-01-05 05:45:53 | 390 次阅读 | 评论: 0 | 来源: PHPERZ
HBase分布式面向列的开源数据库
HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。
http://jiajun.iteye.com/blog/945358 参详-》源码实现
HBase创建表未指定版本 [建表时默认的VERSION是1.]
create 'mytable', {NAME => 'colfam1'}
向'mytable'中添加三条数据:
put 'mytable','001','colfam1','1@'
put 'mytable','001','colfam1','1%'
put 'mytable','001','colfam1','1&'
put 'mytable','001','colfam1','1*'
scan 'mytable' 中的数据【默认只能查看最新的数据,想查看多个版本需要指定下】
看到的最后一条记录。
查找时指定了版本,还是看到最后一条记录。虽然加了VERSIONS,但get的结果是1条;这就是因为建表时默认的VERSION是1.
可以修改VERSIONS:alter 'member',{NAME=>'info','VERSIONS'=>2}
分析:与建表时指定的保留版本数有关系
HBase创建表指定版本:(加了VERSIONS=>3,就可以查到历史的数据了,但是必须再创建表的时候加上VERSIONS,否则无效)
create 'mytable', {NAME => 'colfam1', VERSIONS => 5,MIN_VERSIONS => '3'}
put 'mytable','001','colfam1','1@'
put 'mytable','001','colfam1','1%'
put 'mytable','001','colfam1','jhl'
put 'mytable','001','colfam1','hjf'
get 'mytable','001',{COLUMN => 'colfam1',VERSIONS => 3}
get 'mytable','001',{COLUMN => 'colfam1',VERSIONS => 5}
总结:1.若想保留表的列族的历史记录:就要在当前列上指定版本信息
{COLUMN => 'colfam1',VERSIONS => 5}
2.scan table 始终是扫描到表的每一行的最大版本的那条记录。
参详api解释:
Gets实在Scan的基础上实现的。可以详细参见下面的讨论 Get 同样可以用 Scan来描述.
默认情况下,如果你没有指定版本,当你使用Get操作的时候,会返回最近版本的Cell(该Cell可能是最新写入的,但不能保证)。默认的操作可以这样修改:
如果想要返回返回两个以上的把版本,参见Get.setMaxVersions()
如果想要返回的版本不只是最近的,参见 Get.setTimeRange()
要向查询的最新版本要小于或等于给定的这个值,这就意味着给定的'最近'的值可以是某一个时间点。可以使用0到你想要的时间来设置,还要把max versions设置为1.
下面的Get操作会只获得最新的一个版本。
Get get = new Get(Bytes.toBytes("row1"));
Result r = htable.get(get);
byte[] b = r.getValue(Bytes.toBytes("cf"), Bytes.toBytes("attr")); // returns current version of value
下面的Get操作会获得最近的3个版本。
Get get = new Get(Bytes.toBytes("row1"));
get.setMaxVersions(3); // will return last 3 versions of row
Result r = htable.get(get);
byte[] b = r.getValue(Bytes.toBytes("cf"), Bytes.toBytes("attr")); // returns current version of value
List<KeyValue> kv = r.getColumn(Bytes.toBytes("cf"), Bytes.toBytes("attr")); // returns all versions of this column