12.2.3 HBase Shell
HBase为用户提供了一个非常方便的使用方式,我们称之为HBase Shell。
HBase Shell提供了大多数的HBase命令,通过HBase Shell用户可以方便地创建、删除及修改表,还可以向表中添加数据、列出表中的相关信息等。
在启动HBase之后,用户可以通过下面的命令进入HBase Shell之中:
hbase shell
成功进入之后,用户会看到图12-7所示的界面。
图 12-7 HBase Shell
进入HBase Shell,输入help之后,可以获取HBase Shell所支持的命令,如表12-1所示。
需要注意shutdown操作与exit操作之间的不同:shutdown表示关闭HBase服务,必须重新启动HBase才可以恢复;exit只是退出HBase shell,退出之后完全可以重新进入。
下面,我们将详细介绍常用的HBase命令及其使用方法。
(1)create
create用于通过表名及用逗号分隔开的列族信息来创建表,操作如下:
1)形式一:
hbase>create't1',{NAME=>'f1',VERSIONS=>5}
2)形式二:
hbase>create't1',{NAME=>'f1'},{NAME=>'f2'},{NAME=>'f3'}
hbase>#
上面的命令可以简写为下面所示的格式:
hbase>create't1','f1','f2','f3'
3)形式三:
hbase>create't1',{NAME=>'f1',VERSIONS=>1,TTL=>2592000,
BLOCKCACHE=>true}
下面以“NAME=>'f1'”为例具体说明,其中,列族参数的格式是:箭头左侧为参数变量,右侧为参数对应的值,并用“=>”分开。
(2)list
通过list命令列出所有HBase中包含的表的名称,操作如下:
hbase(main):011:0>list
hbase_tb
test
2 row(s)in 0.0160 secondshbase>list
(3)put
put用于向指定的HBase表单元添加值,例如,向表t1的行r1、列c1:1添加值v1,并指定时间戳为ts的操作如下:
hbase>put't1','r1','c1:1','vl',ts
(4)scan
scan用于获取指定表的相关信息,与create命令类似,可以通过逗号分隔的命令来指定扫描参数。
例如,获取表test的所有值的操作如下:
hbase(main):001:0>scan'test'
ROW COLUMN+CELL
r1 column=c1:1,timestamp=1295692753859,value=value1-1/1
r1 column=c1:2,timestamp=1295692662360,value=value1-1/2
r1 column=c1:3,timestamp=1297476019872,value=value1-1/3
r1 column=c2:1,timestamp=1297475967537,value=value1-2/1
……
获取表test的c1列的所有值的操作如下:
hbase(main):002:0>scan'test',{COLUMNS=>'c1'}
ROW COLUMN+CELL
r1 column=c1:1,timestamp=1295692753859,value=value1-1/1
r1 column=c1:2,timestamp=1295692662360,value=value1-1/2
r1 column=c1:3,timestamp=1297476019872,value=value1-1/3
r2 column=c1:1,timestamp=1297476064414,value=value2-1/1
2 row(s)in 0. 0100 seconds
获取表test的c1列的前一行的所有值的操作如下:
hbase(main):012:0>scan'test',{COLUMNS=>'c1',LIMIT=>1}
ROW COLUMN+CELL
r1 column=c1:1,timestamp=1295692753859,value=value1-1/1
r1 column=c1:2,timestamp=1295692662360,value=value1-1/2
r1 column=c1:3,timestamp=1297476019872,value=value1-1/3
1 row(s)in 0.0120 seconds
(5)get
get用于获取行或单元的值。此命令可以指定表名、行值,以及可选的列值和时间戳。
获取表test行r1的值的操作如下:
hbase(main):002:0>get'test','r1'
COLUMN CELL
c1:1 timestamp=1295692753859,value=value1-1/1
c1:2 timestamp=1295692662360,value=value1-1/2
c1:3 timestamp=1297476019872,value=value1-1/3
c2:1 timestamp=1297475967537,value=value1-2/1
c2:2 timestamp=1297476039968,value=value1-2/2
5 row(s)in 0.0450 seconds
获取表test行r1列c1:1的值的操作如下:
hbase(main):005:0>get'test','r1',{COLUMN=>'c1:1'}
COLUMN CELL
c1:1 timestamp=1295692753859,value=value1-1/1
1 row(s)in 0.0050 seconds
需要注意的是,COLUMN和COLUMNS是不同的,scan操作中的COLUMNS指定的是表的列族,get操作中的COLUMN指定的是特定的列,COLUMN的值实质上为“列族+:+列修饰符”。
另外,在shell中,常量不需要用引号括起来,但二进制的值需要用双引号括起来,而其他值则用单引号括起来。HBase Shell的常量可以通过在shell中输入“Object.constants”命令来查看。
代码清单12-1所示是一个使用HBase Shell操作的具体例子。
代码清单12-1 HBase Shell操作
hbase(main):004:0>create'test','c1','c2'
0 row(s)in 1.0620 seconds
hbase(main):005:0>list
test
1 row(s)in 0.0090 seconds
hbase(main):006:0>put'test','r1','c1:1','value1-1/1'
0 row(s)in 0.0050 seconds
hbase(main):007:0>put'test','r1','c1:2','value1-1/2'
0 row(s)in 0.0060 seconds
hbase(main):008:0>put'test','r1','c1:3','value1-1/3'
0 row(s)in 0.0110 seconds
hbase(main):009:0>put'test','r1','c2:1','value1-2/1'
0 row(s)in 0.0040 seconds
hbase(main):010:0>put'test','r1','c2:2','value1-2/2'
0 row(s)in 0.0030 seconds
hbase(main):011:0>put'test','r2','c1:1','value2-1/1'
0 row(s)in 0.0030 seconds
hbase(main):012:0>put'test','r2','c2:1','value2-2/1'
0 row(s)in 0.0040 seconds
hbase(main):013:0>scan'test'
ROW COLUMN+CELL
r1 column=c1:1,timestamp=1297513518032,value=value1-1/1
r1 column=c1:2,timestamp=1297513531036,value=value1-1/2
r1 column=c1:3,timestamp=1297513538344,value=value1-1/3
r1 column=c2:1,timestamp=1297513553055,value=value1-2/1
r1 column=c2:2,timestamp=1297513560121,value=value1-2/2
r2 column=c1:1,timestamp=1297513580833,value=value2-1/1
r2 column=c2:1,timestamp=1297513594789,value=value2-2/1
2 row(s)in 0.0260 seconds
hbase(main):014:0>get'test','r1',{COLUMN=>'c2:2'}
COLUMN CELL
c2:2 timestamp=1297513560121,value=value1-2/2
1 row(s)in 0.0140 seconds
hbase(main):015:0>disable'test'
0 row(s)in 0.0930 seconds
hbase(main):016:0>drop'test'
0 row(s)in 0.0770 seconds
hbase(main):017:0>exit