Hbase shell学习
通过Shell工具可以对云数据库HBase进行数据管理,包括建表、插入数据、删除数据和删除表等操作,本文介绍Shell的基本使用命令。
访问配置
- 如果使用的是云数据库HBase标准版,基本环境的配置操作请参见使用HBase Shell访问HBase标准版。
- 如果使用的是云数据库HBase增强版,基本环境的配置操作请参见使用HBaseue Shell访问HBase增强版。
常用命令
Shell的使用命令更多请参见Apache HBase Shell介绍。
- Shell数据定义语言
create: 用于创建一个表。 list: 用于列出HBase的所有表。 disable: 用于禁用表。 is_disabled: 用于验证表是否被禁用。 enable: 用于启用一个表。 is_enabled: 用于验证表是否已启用。 describe: 用于提供了一个表的描述。 alter: 用于改变一个表。 exists: 用于验证表是否存在。 drop: 用于从HBase中删除表。
- Shell数据操作语言
put: 用于把指定列在指定的行中单元格的值在一个特定的表。 get: 用于取行或单元格的内容。 delete:用于删除表中的单元格值。 deleteall: 用于删除给定行的所有单元格。 scan: 用于扫描并返回表数据。 count: 用于计数并返回表中的行的数目。 truncate: 清空表中的数据,其内部实现是将指定的表下线、删除、重建,该操作会丢失Region分区 truncate_preserve:清空表中的数据,其内部实现是将指定的表下线、删除、重建,并且Region分区与旧表保留一致
进入和退出Shell环境
- 执行以下命令进入Shell环境。
bin/hbase shell
- 执行以下命令退出Shell环境。
quit
- 使用
help
命令查看基本命令和对应的使用方法。help
基本操作
- 创建表
使用
create
命令来创建表格,在创建的时候必须输入表的名称和列族的名称。//创建一个名称为test,列族名为cf的表 create 'test', 'cf'
- 查询所有表的信息
使用
list
命令来查询HBase数据库中所有表的信息,也可以使用正则表达式来过滤表。list list 'abc.*' list 'test'
- 插入数据
使用
put
命令为新创建的表插入数据。执行以下语句插入三条数据。put 'test', 'row1', 'cf:a', 'value1' put 'test', 'row2', 'cf:b', 'value2' put 'test', 'row3', 'cf:c', 'value3'
说明 语句中test
为表名,row1
为表的Rowkey,cf:a
表示自定义列,列族名和列名,value1
为值。 - 查询指定表的数据
scan
是一种访问HBase数据的方式,它非常的灵活,scan
操作可以用它来扫描全表,也可以用它查询固定范围。查询速度会比查询单条(使用get
)数据略慢一些,这里因为我们的demo数据库数据并不多,所以我们全部取出来。执行以下语句可以查询test表的数据。scan 'test'
返回数据如下:ROW COLUMN+CELL row1 column=cf:a, timestamp=1421762485768, value=value1 row2 column=cf:b, timestamp=1421762491785, value=value2 row3 column=cf:c, timestamp=1421762496210, value=value3 3 row(s) in 0.0230 seconds
- 查询表的单条数据
使用
get
来查询表的单条数据。get 'test', 'row1'
返回数据如下:COLUMN CELL cf:a timestamp=1421762485768, value=value1 1 row(s) in 0.0350 seconds
- 禁用和启用指定表
如果您想要删除一张表,或者改变一张表的设置,或者其他类似的场景。您需要使用disable命令先禁用这张表,删除或者修改配置完成后,使用enable命令启用表,重新使用这张表。
disable 'test' enable 'test'
- 删除指定表
如果您想要删除一张表,使用drop命令,这是一个危险的操作,请谨慎使用。
drop 'test'
常用配置
- 为指定表设置Major Compaction周期(无特殊情况下不建议自行设置)。
Major Compaction周期的单位为毫秒(ms),默认值是7天,设置为0表示关闭周期。
alter 'test', CONFIGURATION => {'hbase.hregion.majorcompaction' => 300000}
- 为指定表的列族设置数据压缩格式。
云数据库HBase的数据压缩详情介绍请参见数据压缩与编码。
alter 'test', NAME => 'cf', COMPRESSION => 'SNAPPY'
- 为指定表的列族设置Block Encoding类型。
将test表列族的Block Encoding类型设置为DATA_BLOCK_ENCODING。
alter 'test', NAME => 'cf', DATA_BLOCK_ENCODING => 'DIFF'
- 为指定表的列族设置数据存活时间(Time To Live,简称TTL)。
TTL单位为秒(s),例如2592000s=30天。
alter 'test', NAME => 'cf', TTL => 2592000
- 为指定表设置预分区。云数据库HBase的预分区详情介绍请参见设置预分区。
一个学生成绩表的例子来演示hbase的用法。
name | grade | course | |
math | english | ||
Tom | 5 | 97 | 87 |
Jim | 4 | 89 | 80 |
表的创建:语法:create '表名称','列簇名称1','列簇名称2'........
create 'student','name','grade','course'
desc 'student'
结果:
{ NAME=>'course', DATA_BLOCK_ENCODING=>'NONE', BLOOMFILTER=>'ROW', REPLICATION_SCOPE=>'0', VERSIONS=>'1', COMPRESSION=>'NONE', MIN_VERSIONS=>'0', TTL=>'FOREVER', KEEP_DELETED_CELLS=>'FALSE', BLOCKSIZE=>'65536', IN_MEMORY=>'false', BLOCKCACHE=>'true' }{ NAME=>'grade', DATA_BLOCK_ENCODING=>'NONE', BLOOMFILTER=>'ROW', REPLICATION_SCOPE=>'0', VERSIONS=>'1', COMPRESSION=>'NONE', MIN_VERSIONS=>'0', TTL=>'FOREVER', KEEP_DELETED_CELLS=>'FALSE', BLOCKSIZE=>'65536', IN_MEMORY=>'false', BLOCKCACHE=>'true' }{ NAME=>'name', DATA_BLOCK_ENCODING=>'NONE', BLOOMFILTER=>'ROW', REPLICATION_SCOPE=>'0', VERSIONS=>'1', COMPRESSION=>'NONE', MIN_VERSIONS=>'0', TTL=>'FOREVER', KEEP_DELETED_CELLS=>'FALSE', BLOCKSIZE=>'65536', IN_MEMORY=>'false', BLOCKCACHE=>'true' }
新增列簇:
alter '表名称',NAME='列簇名称'
hbase(main):068:0> alter 'student',NAME=>'age' Updating all regions with the new schema... 1/1 regions updated.
删除列簇:
alter '表名称',NAME=>'列簇名称',METHOD=>'delete'
alter 'student',NAME=>'test',METHOD=>'delete'
删除一个表:之前,必须先将该表disable掉。
disable 'student' drop 'student'
给表添加记录:
put '表名称','rowkey','列簇名称:列名称','值'
put 'student','001201509011001','name','Tom'
结果:
hbase(main):085:0> scan 'student' ROW COLUMN+CELL 001201509011001 column=name:, timestamp=1447766388162, value=Tom 1 row(s) in 0.0090 seconds
继续执行:name列簇的value='jim',但是rowkey 不变,
hbase(main):086:0> put 'student','001201509011001','name','Jim'
结果还是一条数据,001201509011001的rowkey,被第二条数据覆盖。
scan 'student' ROW COLUMN+CELL 001201509011001 column=name:, timestamp=1447766492893, value=Jim
put 'student','001201509011001','course:math','100'
put 'student','001201509011001','course:english','100'
hbase(main):096:0> scan 'student' ROW COLUMN+CELL 001201509011001 column=course:english, timestamp=1447766828720, value=100 001201509011001 column=course:math, timestamp=1447766813289, value=100 001201509011001 column=grade:, timestamp=1447766751652, value=2 001201509011001 column=name:, timestamp=1447766492893, value=Jim 001201509011002 column=name:, timestamp=1447766547713, value=Tom
加了很多rowKey进行测试:如下
base(main):127:0> scan 'student' ROW COLUMN+CELL 001201509011001 column=course:english, timestamp=1447766828720, value=100 001201509011001 column=course:math, timestamp=1447766813289, value=100 001201509011001 column=grade:, timestamp=1447766751652, value=2 001201509011001 column=name:, timestamp=1447766492893, value=Jim 001201509011002 column=course:english, timestamp=1447766987607, value=95 001201509011002 column=course:math, timestamp=1447767003501, value=80 001201509011002 column=grade:, timestamp=1447767073299, value=6 001201509011002 column=name:, timestamp=1447766547713, value=Tom 001201509011003 column=grade:, timestamp=1447767130750, value=5 001201509011004 column=grade:, timestamp=1447767139371, value=3 001201509011005 column=grade:, timestamp=1447767146338, value=3 001201509011006 column=course:math, timestamp=1447767489278, value=30 001201509011006 column=grade:, timestamp=1447767153088, value=2 001201509011007 column=course:math, timestamp=1447767474245, value=87 001201509011007 column=grade:, timestamp=1447767173296, value=2 001201509011008 column=grade:, timestamp=1447767181639, value=3 001201509011008 column=name:, timestamp=1447767278902, value=lucy 001201509011009 column=grade:, timestamp=1447767190450, value=10 001201509011009 column=name:, timestamp=1447767257259, value=Mike 001201509011010 column=grade:, timestamp=1447767198644, value=11 001201509011010 column=name:, timestamp=1447767236548, value=Peter
根据rowkey查看对应列的数据:
get '表名称','rowkey','列簇名称:列名称'
get 'student','001201509011001','name'
COLUMN CELL name: timestamp=1447766492893, value=Jim
查看表中的记录数:根据列簇来统计:
hbase(main):133:0* count 'student'
结果:10
查询表中指定列的所有记录:
语法:scan '表名',{COLUMNS =>'列簇'}
hbase(main):134:0> scan 'student',{COLUMNS=>'name'}
ROW COLUMN+CELL 001201509011001 column=name:, timestamp=1447766492893, value=Jim 001201509011002 column=name:, timestamp=1447766547713, value=Tom 001201509011008 column=name:, timestamp=1447767278902, value=lucy 001201509011009 column=name:, timestamp=1447767257259, value=Mike 001201509011010 column=name:, timestamp=1447767236548, value=Peter
hbase(main):135:0> scan 'student',{COLUMNS=>'grade'} ROW COLUMN+CELL 001201509011001 column=grade:, timestamp=1447766751652, value=2 001201509011002 column=grade:, timestamp=1447767073299, value=6 001201509011003 column=grade:, timestamp=1447767130750, value=5 001201509011004 column=grade:, timestamp=1447767139371, value=3 001201509011005 column=grade:, timestamp=1447767146338, value=3 001201509011006 column=grade:, timestamp=1447767153088, value=2 001201509011007 column=grade:, timestamp=1447767173296, value=2 001201509011008 column=grade:, timestamp=1447767181639, value=3 001201509011009 column=grade:, timestamp=1447767190450, value=10 001201509011010 column=grade:, timestamp=1447767198644, value=11 10 row(s) in 0.0220 seconds
hbase(main):136:0> scan 'student',{COLUMNS=>'course'} ROW COLUMN+CELL 001201509011001 column=course:english, timestamp=1447766828720, value=100 001201509011001 column=course:math, timestamp=1447766813289, value=100 001201509011002 column=course:english, timestamp=1447766987607, value=95 001201509011002 column=course:math, timestamp=1447767003501, value=80 001201509011006 column=course:math, timestamp=1447767489278, value=30 001201509011007 column=course:math, timestamp=1447767474245, value=87 4 row(s) in 0.0130 seconds
查询表中指定区间的所有记录数:
也可以指定一些修饰词:TIMERANGE, FILTER, LIMIT, STARTROW, STOPROW, TIMESTAMP, MAXLENGTH,or COLUMNS。没任何修饰词,就是上边例句,就会显示所有数据行。
语法:scan '表名',{COLUMNS =>'列簇',LIMIT =>记录数,STARTROW=>'开始rowkey',STOPROW=>'结束rowkey'}
取出name列族,前3条记录
hbase(main):012:0> scan 'student',{COLUMNS=>['name'],LIMIT=>3} ROW COLUMN+CELL 001201509011001 column=name:, timestamp=1447766492893, value=Jim 001201509011002 column=name:, timestamp=1447766547713, value=Tom 001201509011008 column=name:, timestamp=1447767278902, value=lucy
取出name列族,前3条记录 rowkey[001201509011001,001201509011008) 左边闭合,右边开的数据。
hbase(main):014:0> scan 'student',{COLUMNS=>['name'],LIMIT=>3,STARTROW=>'001201509011001',STOPROW=>'001201509011008'} ROW COLUMN+CELL 001201509011001 column=name:, timestamp=1447766492893, value=Jim 001201509011002 column=name:, timestamp=1447766547713, value=Tom
指定两列:name,grade
hbase(main):018:0> scan 'student',{COLUMNS=>['name','grade'],STARTROW=>'001201509011001',STOPROW=>'001201509011010'}
ROW COLUMN+CELL 001201509011001 column=grade:, timestamp=1447766751652, value=2 001201509011001 column=name:, timestamp=1447766492893, value=Jim 001201509011002 column=grade:, timestamp=1447767073299, value=6 001201509011002 column=name:, timestamp=1447766547713, value=Tom 001201509011003 column=grade:, timestamp=1447767130750, value=5 001201509011004 column=grade:, timestamp=1447767139371, value=3 001201509011005 column=grade:, timestamp=1447767146338, value=3 001201509011006 column=grade:, timestamp=1447767153088, value=2 001201509011007 column=grade:, timestamp=1447767173296, value=2 001201509011008 column=grade:, timestamp=1447767181639, value=3 001201509011008 column=name:, timestamp=1447767278902, value=lucy 001201509011009 column=grade:, timestamp=1447767190450, value=10 001201509011009 column=name:, timestamp=1447767257259, value=Mike
可以根据 TIMERANGE查询:
hbase(main):020:0> scan 'student',{COLUMNS=>['grade'],LIMIT => 3,TIMERANGE=>[1447766751652,1447767257259]}
ROW COLUMN+CELL 001201509011001 column=grade:, timestamp=1447766751652, value=2 001201509011002 column=grade:, timestamp=1447767073299, value=6 001201509011003 column=grade:, timestamp=1447767130750, value=5
删除数据:
rowkey=001201509011002 的数据有4列
hbase(main):024:0> get 'student','001201509011002' COLUMN CELL course:english timestamp=1447766987607, value=95 course:math timestamp=1447767003501, value=80 grade: timestamp=1447767073299, value=6 name: timestamp=1447766547713, value=Tom
删除一行数据:
hbase(main):027:0> delete 'student','001201509011002','grade'
hbase(main):028:0> get 'student','001201509011002' COLUMN CELL course:english timestamp=1447766987607, value=95 course:math timestamp=1447767003501, value=80 name: timestamp=1447766547713, value=Tom
查看那一行的数据:发现没有了。
hbase(main):033:0> scan 'student',{COLUMNS=>['grade'],STARTROW=>'001201509011002',STOPROW=>'001201509011003'} ROW COLUMN+CELL 0 row(s) in 0.0080 seconds