Hbase的学习笔记(2)
在Hbase的学习笔记(1)中 主要是对Hbase相关的理论知识简单说了一点。在Hbase的学习笔记(2)中 主要是学习Hbase简单的增删改查命令。
Hbase的基础shell命令操作
1. 进入Hbase shell命令行窗口
连接虚拟机进入shell命令模式,在bin目录下执行:
./hbse shell
或者,直接输入bin的路径配合shell命令使用,比如我的hbase的bin目录存放的路径为 /usr/hdp/current/hbase-client/bin,那么就可以使用如下命令:
/usr/hdp/current/hbase-client/bin/hbase shell
输入完命令后执行,光标所在行为:
hbase(main):001:0>
2. 查看所有表
输入list
命令,查看当前所有表(我这边显示有两个表是之前有过的表)
hbase(main):001:0> list
TABLE
futuresFunctionBar
selfstock
2 row(s)
Took 1.0300 seconds
=> ["futuresFunctionBar","selfstock"]
3. 创建表
要新建一个表,首先必须要给它起个名字,并为其定义模式,一个表的模式包含表的属性和列族的列表。
eg: 我们想新建一个名为test的表,使其中包含一个名为data的列,表和列族属性都为默认值,则可以使用如下命令:(注意:不区分单引号双引号)
hbase(main):002:0> create 'test','data'
Created table test
Took 5.5800 seconds
=> Hbase::Table - test
如上,“test"是表名;”data“是列族名,可以在创建表时定义一个至多个列族
创建完毕之后可以输入list来查看表是否创建成功:
hbase(main):003:0> list
TABLE
futuresFunctionBar
selfstock
test
3 row(s)
Took 0.0289 seconds
=> ["futuresFunctionBar","selfstock","test"]
4. 插入数据
使用 put
命令 可以用来添加数据或者更新数据:
put命令规范为:
put ’ table ’ , ’ row key ’ , ’ column_family : column ’ , ’ value ’
hbase(main):004:0> put 'test','row1',"data:1","value1"
Took 0.2251 seconds
hbase(main):005:0> put 'test','row2',"data:2","value2"
Took 0.0130 seconds
当然,put 方法类似的还有更多,可以使用 help 'put'
命令查看:
hbase(main):010:0> help "put"
Put a cell 'value' at specified table/row/column and optionally
timestamp coordinates. To put a cell value into table 'ns1:t1' or 't1'
at row 'r1' under column 'c1' marked with the time 'ts1', do:
hbase> put 'ns1:t1', 'r1', 'c1', 'value'
hbase> put 't1', 'r1', 'c1', 'value'
hbase> put 't1', 'r1', 'c1', 'value', ts1
hbase> put 't1', 'r1', 'c1', 'value', {ATTRIBUTES=>{'mykey'=>'myvalue'}}
hbase> put 't1', 'r1', 'c1', 'value', ts1, {ATTRIBUTES=>{'mykey'=>'myvalue'}}
hbase> put 't1', 'r1', 'c1', 'value', ts1, {VISIBILITY=>'PRIVATE|SECRET'}
The same commands also can be run on a table reference. Suppose you had a reference
t to table 't1', the corresponding command would be:
hbase> t.put 'r1', 'c1', 'value', ts1, {ATTRIBUTES=>{'mykey'=>'myvalue'}}
5. 读取数据
当我们想获取第二行的数据时,使用 get 命令可以获取数据。
hbase(main):006:0> get 'test','row2'
COLUMN CELL
data:2 timestamp=1645682739375, value=value2
Took 0.0592 seconds
同样的,类似的get方法还有别的,用help 'get'
命令查看:
hbase(main):011:0> help "get"
Get row or cell contents; pass table name, row, and optionally
a dictionary of column(s), timestamp, timerange and versions. Examples:
hbase> get 'ns1:t1', 'r1'
hbase> get 't1', 'r1'
hbase> get 't1', 'r1', {TIMERANGE => [ts1, ts2]}
hbase> get 't1', 'r1', {COLUMN => 'c1'}
hbase> get 't1', 'r1', {COLUMN => ['c1', 'c2', 'c3']}
hbase> get 't1', 'r1', {COLUMN => 'c1', TIMESTAMP => ts1}
hbase> get 't1', 'r1', {COLUMN => 'c1', TIMERANGE => [ts1, ts2], VERSIONS => 4}
hbase> get 't1', 'r1', {COLUMN => 'c1', TIMESTAMP => ts1, VERSIONS => 4}
hbase> get 't1', 'r1', {FILTER => "ValueFilter(=, 'binary:abc')"}
hbase> get 't1', 'r1', 'c1'
hbase> get 't1', 'r1', 'c1', 'c2'
hbase> get 't1', 'r1', ['c1', 'c2']
hbase> get 't1', 'r1', {COLUMN => 'c1', ATTRIBUTES => {'mykey'=>'myvalue'}}
hbase> get 't1', 'r1', {COLUMN => 'c1', AUTHORIZATIONS => ['PRIVATE','SECRET']}
hbase> get 't1', 'r1', {CONSISTENCY => 'TIMELINE'}
hbase> get 't1', 'r1', {CONSISTENCY => 'TIMELINE', REGION_REPLICA_ID => 1}
6. 查看表数据
当需要对已知表进行查看所有数据时。使用 scan
命令:
hbase(main):007:0> scan 'test'
Row COLUMN+CELL
row1 column=data:1, timestamp=1645682714578, value=value1
row2 column=data:2, timestamp=1645682739375, value=value2
2 row(s)
Took 0.2275 seconds
如上是获取整张表的数据,若想取某一列族如 ”column_family_1"下的数据,则其命令规范为:
scan ‘ table ’ , { COLUMN => ’ column_family_1 ’ }
上述规范等同于:
scan ‘ table ’ , { COLUMN => [ ’ column_family_1 ’ ] }
若需要取多列列族下(如 ”column_family_1", ”column_family_2")的数据,则命令规范为:
scan ‘ table ’ , { COLUMN => [ ’ column_family_1 ’ ] , [ ’ column_family_2 ’ ] }
再细致一点,可能需要获取 ’ column_family_1 ’ 列族下,’ column_1 ’ 列的数据:
scan ‘ table ’ , { COLUMN => [ ’ column_family_1 : column_1 ’ ] }
同样的,多列数据可以这样获取:
scan ‘ table ’ , { COLUMN => [ ’ column_family_1 : column_1 ’ , ’ column_family_2 : column_3’ ] }
若要获取 row key 大于等于某key的情况:(STARTROW
)
scan ‘ table ’ , { COLUMN => [ ’ column_family_1 : column_1 ’ , ’ column_family_2 : column_3’ ] , STARTROW => ’ key-2 ’ }
同样,获取 row key 小于某key 的情况:(STOPROW
)
scan ‘ table ’ , { COLUMN => [ ’ column_family_1 : column_1 ’ , ’ column_family_2 : column_3’ ] , STOPROW => ’ key_2 ’ }
获取两key之间的,如大于等于key_2,小于key_5 :
scan ‘ table ’ , { COLUMN => [ ’ column_family_1 : column_1 ’ , ’ column_family_2 : column_3’ ] , STARTROW => ’ key_2 ’ , STOPROW => ’ key_5 ’ }
需要注意的是关键字 STARTROW 与 STOPROW 稍有区别,STARTROW 后的 row key 是包含在内,而STOPROW后的 row key 则是不包含的关系,相当于 “左闭右开” 的关系。
使用 scan 命令扫描一张表的数据时,我们常常会限制下输出 row key 条数 :
scan ’ table ’ , { LIMIT => 2 }
虽然上述规范中是 “LIMIT => 2”,但返回的结果不一定是2条,它可能是大于2条的。因为 row key是唯一主键,这个限制的数量是针对主键 rowkey的。所以limit => 2 指的是不超过2种的rowkey 的所有数据。
若想以反序获取两行数据:
scan ’ table ’ , { LIMIT => 2 ,REVERSED => true }
默认情况下,REVERSED => false
是代表数据正序读取,当设置 REVERSED => true
时,代表数据反序读取。
7. 查看表详情
当需要看表的详细信息时,使用 desc
命令 或者使用describe
命令:
hbase(main):008:0> desc 'test'
Table test_table is ENABLED
test_table
COLUMN FAMILIES DESCRIPTION
{Name => 'data', VERSIONs =>'1', EVICT_BLOCKS_ON_CLOSE =>'false', NEW_VERSION_BEHAVICK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '0',BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'fales', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536'}
1 row(s)
Took 0.0890 seconds
8. 删除数据
当数据插入不当时,可用delete
命令删除:
delete ’ table ’ , ’ row key ’ , ’ column_family_1 : column ’
当需要删除整行数据时, 使用 deleteall
命令:
hbase(main):009:0> deleteall 'test', 'row1'
Took 0.0187 seconds
删完这一行查看剩下的数据:
hbase(main):010:0> scan 'test'
Row COLUMN+CELL
row2 column=data:2, timestamp=1645682739375, value=value2
1 row(s)
Took 0.0148 seconds
若需要删除整张表的数据(表结构还在),可用truncate
命令:
truncate ’ table ’
9. 删除表
当需要将创建好的表删除,比如要删除 ’test’ 这张表,首先我们要把它设为禁用,然后删除。如果直接 drop 表,会报错。
可以发现删除表需要两个步骤:
disable table
drop table
表创建成功后,默认状态是enable,即“使用中”的状态,删除表之前需要先设置表为“关闭中”。
- 设置表为“使用中”:
enable ‘table'
- 设置表为”关闭中“:
disable 'table'
hbase(main):011:0> disable 'test'
Took 3.9249 seconds
hbase(main):012:0> drop 'test'
Took 2.5588 seconds
hbase(main):013:0> list
TABLE
futuresFunctionBar
selfstock
2 row(s)
Took 1.0300 seconds
=> ["futuresFunctionBar","selfstock"]
10. 统计表数据行数
当需要统计表数据行数时,使用 count 命令:
count ’ table ’
11. 增加列族
alter ‘ table ’ , { NAME => ’ new_column_family ’ , VERSIONS => ’ number ’ }
12. 删除列族
alter ’ table ’ , { NAME => ’ column_family ’ , METHOD => ’ delete ’ }