HBase入门:shell 方式数据修改和删除
目录简介:准备:修改数据:Put要么向表增加新行 (如果key是新的) 或更新行 (如果key已经存在)查看数据:hbase每次put因为没有指定版本,因此理论上时可以多版本并存的为什么只有最新的版本数据呢?查看表结构信息调整列簇的版本数量删除数据删除目标1:删除数据ID = row3的列簇liecuA中age列的数据(删除操作最小单元)删除目标2:删除数据ID = row3的列簇liecuA 相
目录
修改数据:Put要么向表增加新行 (如果key是新的) 或更新行 (如果key已经存在)
查看数据:hbase每次put因为没有指定版本,因此理论上时可以多版本并存的
删除数据ID = row3的列簇liecuA中age列的数据(删除操作最小单元)
删除数据ID = row3的列簇liecuA 相关数据(如果test表中有多个列粗,那么删除liecuA不会影响row3其他列簇的数据)
简介:
增删改查这四个是我们关系型数据库最常用的,通常很多程序员经常调侃自己做的事情就是增删改查。同样使用hbase我们也要做增删改查,毕竟非关系数据库也是数据库啊!!!
上一篇文章,记录了表创建,数据添加和禁用表,删除表,那么本文主要记录如何数据修改,如何删除一条数据。听上去很easy吧!本文依旧采用shell方式进行数据管理。
准备:
因为上篇文章操作完成后,我们就已经将创建的test表给删除掉了,因此本文的操作就要重新再将test创建并初始化数据
houliangdeMacBook-Pro:hbase-2.3.7 houliang$ ./bin/hbase shell
2021-11-13 16:36:36,339 WARN [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
HBase Shell
Use "help" to get list of supported commands.
Use "exit" to quit this interactive shell.
For Reference, please visit: http://hbase.apache.org/2.0/book.html#shell
Version 2.3.7, r8b2f5141e900c851a2b351fccd54b13bcac5e2ed, Tue Oct 12 16:38:55 UTC 2021
Took 0.0006 seconds
hbase(main):001:0> create 'test', 'liecuA'
Created table test
Took 0.9514 seconds
=> Hbase::Table - test
hbase(main):002:0> put 'test', 'row1', 'liecuA:name', '张三'
Took 0.1449 seconds
hbase(main):003:0> put 'test', 'row2', 'liecuA:name', '李四'
Took 0.0038 seconds
hbase(main):004:0> put 'test', 'row3', 'liecuA:name', '茉莉'
Took 0.0034 seconds
hbase(main):005:0> put 'test', 'row3', 'liecuA:age', '18'
Took 0.0051 seconds
修改数据:Put要么向表增加新行 (如果key是新的) 或更新行 (如果key已经存在)
1、将ID:row3的数据,列簇:liecuA 列:age 修改为20
hbase(main):006:0> put 'test', 'row3', 'liecuA:age', '20'
Took 0.0093 seconds
hbase(main):007:0> get 'test','row3'
COLUMN CELL
liecuA:age timestamp=2021-11-13T16:43:43.841, value=20
liecuA:name timestamp=2021-11-13T16:37:49.506, value=\xE8\x8C\x89\xE8\x8E\x89
1 row(s)
Took 0.0489 seconds
查看数据:hbase每次put因为没有指定版本,因此理论上时可以多版本并存的
注:版本可以设置表版本保留数量,列簇版本保留数量,以及列版本保留数量。
hbase(main):012:0> put 'test', 'row3', 'liecuA:name', 'x茉莉'
Took 0.0051 seconds
hbase(main):013:0> put 'test', 'row3', 'liecuA:name', '1茉莉'
Took 0.0022 seconds
hbase(main):014:0> get 'test','row3',{COLUMN=>'liecuA:name',VERSIONS=>10}
COLUMN CELL
liecuA:name timestamp=2021-11-13T16:58:46.881, value=1\xE8\x8C\x89\xE8\x8E\x89
1 row(s)
Took 0.0040 seconds
为什么只有最新的版本数据呢?查看表结构信息
hbase(main):015:0> describe 'test'
Table test is ENABLED
test
COLUMN FAMILIES DESCRIPTION
{NAME => 'liecuA', BLOOMFILTER => 'ROW', IN_MEMORY => 'false', VERSIONS => '1', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', COMPRESSION => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE =>
'65536', REPLICATION_SCOPE => '0'}
1 row(s)
Quota is disabled
Took 0.0676 seconds
可以看出表结构信息中指定了VERSIONS 数量为 1,因此在不改变列簇或列的版本数量下只能有最新一次修改的数据,而看不到其他版本的数据
调整列簇的版本数量
因为版本不是本文重点,后续会专门整理HBase 相关的文章,这里只是让大家先了解HBase中有版本的概念,以及版本可以灵活的控制
以下命令涉及:
1.调整test表liecuA列簇的版本数量为3
2.重新查询表信息,确认版本数量修改生效
3.对ID=row3的数据,修改3次
4.get 方式请求数据并将保留的版本数据展示
hbase(main):016:0> alter 'test' ,{NAME=>'liecuA', VERSIONS=>3}
Updating all regions with the new schema...
1/1 regions updated.
Done.
Took 1.6845 seconds
hbase(main):017:0> describe 'test'
Table test is ENABLED
test
COLUMN FAMILIES DESCRIPTION
{NAME => 'liecuA', BLOOMFILTER => 'ROW', IN_MEMORY => 'false', VERSIONS => '3', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', COMPRESSION => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE =>
'65536', REPLICATION_SCOPE => '0'}
1 row(s)
Quota is disabled
Took 0.0291 seconds
hbase(main):018:0> put 'test', 'row3', 'liecuA:name', '1茉莉'
Took 0.0049 seconds
hbase(main):019:0> put 'test', 'row3', 'liecuA:name', '2茉莉'
Took 0.0028 seconds
hbase(main):020:0> put 'test', 'row3', 'liecuA:name', '3茉莉'
Took 0.0020 seconds
hbase(main):023:0> get 'test','row3',{COLUMN=>'liecuA:name:toString',VERSIONS=>10}
COLUMN CELL
liecuA:name timestamp=2021-11-13T17:28:14.094, value=3茉莉
liecuA:name timestamp=2021-11-13T17:28:04.468, value=2茉莉
liecuA:name timestamp=2021-11-13T17:27:53.809, value=1茉莉
1 row(s)
Took 0.0082 seconds
删除数据
删除数据,使用delete 命令可以从表中删除一个单元格或一个行集,语法与put类似,必须指明表名和列族名称,而列名和时间戳是可选的。
目前test表中三条数据,分别是row1,row2,row3
hbase(main):025:0> scan 'test',{FORMATTER => 'toString'}
ROW COLUMN+CELL
row1 column=liecuA:name, timestamp=2021-11-13T16:37:28.520, value=张三
row2 column=liecuA:name, timestamp=2021-11-13T16:37:38.354, value=李四
row3 column=liecuA:age, timestamp=2021-11-13T16:43:43.841, value=20
row3 column=liecuA:name, timestamp=2021-11-13T17:28:14.094, value=3茉莉
3 row(s)
Took 0.0166 seconds
删除目标1:
删除数据ID = row3的列簇liecuA中age列的数据(删除操作最小单元)
注:删除操作也可以带版本条件哦
hbase(main):030:0> delete 'test', 'row3', 'liecuA:age'
Took 0.0035 seconds
hbase(main):031:0> scan 'test',{FORMATTER => 'toString'}
ROW COLUMN+CELL
row1 column=liecuA:name, timestamp=2021-11-13T16:37:28.520, value=张三
row2 column=liecuA:name, timestamp=2021-11-13T16:37:38.354, value=李四
row3 column=liecuA:name, timestamp=2021-11-13T17:28:14.094, value=3茉莉
3 row(s)
删除目标2:
删除数据ID = row3的列簇liecuA 相关数据(如果test表中有多个列粗,那么删除liecuA不会影响row3其他列簇的数据)
hbase(main):032:0> delete 'test', 'row3', 'liecuA'
Took 0.0068 seconds
hbase(main):033:0> scan 'test',{FORMATTER => 'toString'}
ROW COLUMN+CELL
row1 column=liecuA:name, timestamp=2021-11-13T16:37:28.520, value=张三
row2 column=liecuA:name, timestamp=2021-11-13T16:37:38.354, value=李四
row3 column=liecuA:name, timestamp=2021-11-13T17:28:14.094, value=3茉莉
3 row(s)
Took 0.0053 seconds
有没有发现row3 的列簇liecuA数据依然存在!!!!
注意:delete 操作并不会马上删除数据,只会将对应的数据打上删除标记(tombstone),只有在合并数据时,数据才会被删除。
删除目标3:
删除数据ID=row2的所有列簇数据(整条记录删除)
hbase(main):034:0> deleteall 'test', 'row2'
Took 0.0080 seconds
hbase(main):035:0> scan 'test',{FORMATTER => 'toString'}
ROW COLUMN+CELL
row1 column=liecuA:name, timestamp=2021-11-13T16:37:28.520, value=张三
row3 column=liecuA:name, timestamp=2021-11-13T17:28:14.094, value=3茉莉
2 row(s)
Took 0.0051 seconds
更多推荐
所有评论(0)