BigTable/HBase基本概念解读 & Hbase shell常用命令

BigTable是Key/Value数据库的元老之一。作为Google平台的主要部件,它相对于其他的K-V store较为复杂。在BigTable论文中,是这样定义的:

A Bigtable is a sparse, distributed, persistent multidimensional sorted map.

进一步解释如下:

The map is indexed by a row key, column key, and a timestamp; each value in the map is an uninterpreted array of bytes.

HBase则是Apache的一个模仿BigTable的项目,它在自我介绍时也毫不掩饰这一点:

HBase uses a data model very similar to that of Bigtable. Users store data rows in labelled tables. A data row has a sortable key and an arbitrary number of columns. The table is stored sparsely, so that rows in the same table can have crazily-varying columns, if the user likes.

这几句话看起来还是有些抽象,下面按下面几个关键字逐个解释一下:mappersistentdistributedsortedmulti-dimentionalsparse

map

从本质上讲,BigTable/HBase是一个map。实际上,所有的K-V store都是一个map。

 

persistent

和其他场景中的persistent一样,这里的意思也是数据在处理完后会被持久化(存储在硬盘上)。

 

distributed

HBase和BigTable都是建立在分布式文件系统之上的,所以它的底层存储可以扩展到一系列机器上。主要目的是为了防止单点失败。

 

sorted

BigTable/HBase中的key-value对是对key严格按字母表顺序排序的。

对value没有任何排序机制

在设计key的时候,要考虑让相关的value的key排序位置比较接近。

 

multi-dimentional

multi-dimentional map可以理解为一个values也是map的map。

 

BigTable/HBase中的map层次为:

key: column family: qualifier: timestamp → value

如下图:

{

  // ...

  "aaaaa" : {

    "A" : {

      "foo" : {

        15 : "y",

        4 : "m"

      },

      "bar" : {

        15 : "d",

      }

    },

    "B" : {

      "" : {

        6 : "w"

        3 : "o"

        1 : "w"

      }

    }

  },

  // ...

}

在上例中,“aaaaa”是一个key,有两个column family:“A”和“B”,“foo”和“bar”是“A”的qualifier。15,4是两个timestamp,分别对应“y”和“m”这两个value

 

column family: qualifier” 构成一个column

注意,column families不可删改,增加column family的开销也比较大。所以最好是在设计的时候就把column families定死。qualifier可以为空。

columns是可以修改的,也就是说qualifier的增删改都允许。

timestamp的默认值是从当前epoch开始计的秒数,也可以是自己选择的一个整数。

 

sparse

首先,每一行可以有任意个数个columns,可以有很多,也可能根本就没有column;

其次,行与行之间也可能存在空隙(比如空行)。

 


Hbase shell 常用命令:

名称
命令表达式
创建表
create '表名称', '列名称1','列名称2','列名称N'
添加记录      
put '表名', '行名称(row key)', '列名称(column family:qualifier)', '值(value)'
查看记录
get '表名称', '行名称'
查看表中的记录总数
count  '表名称'
删除记录
delete  ' 表名' ,'行名称' , '列名称'
删除一张表
先要屏蔽该表,才能对该表进行删除,第一步 disable '表名称' 第二步  drop '表名称'
查看所有记录
scan "表名称"  
查看某个表某个列中所有数据
scan "表名称" , ['列名称:']
更新记录 
就是重写一遍进行覆盖

 

1. 创建表

 create 'student','name','address'  

 新建student表,该表有两列 名称和地址,名称只有一个,address可以有多个

 

2.插入一条记录,只能插入某列

  put 'student','1','name','tom' 

 向student表中插入记录,记录的row值为1,列name的值为tom

 

3. 根据row值 查询一条记录

    get 'student','1'

 

 查询结果:

COLUMN                       CELL

 name:                       timestamp=1301473112875, value=tom

 

4. 根据row值更新name值 (系统会直接更新)

   put 'student','1','name','tom2'

 

5.再查询时,系统返回最新的值

  hbase(main):052:0> get 'student','1'

  COLUMN                       CELL

  name:                       timestamp=1301473425265, value=tom2

 

6.根据timestamp查询更新之前的 name值,

    get 'student','1',{COLUMN=>'name',TIMESTAMP=>1301473112875}

 

7. 给学生的地址簇插入家庭地址

 put 'student','1','address:home','shenzhen street'

 

8. 给学生的地址簇插入学校地址

 put 'student','1','address:school','huaqiangbei street'

 

9. 查询学生的家庭地址

 get 'student','1',{COLUMN=>'address:home'}

10. scan一张表的记录,限制输出记录的数量

1
scan 'table_name', {LIMIT => 2}

表示限制只输出两个key的记录。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值