目录

简介:

准备:

修改数据:Put要么向表增加新行 (如果key是新的) 或更新行 (如果key已经存在)

查看数据:hbase每次put因为没有指定版本,因此理论上时可以多版本并存的

为什么只有最新的版本数据呢?查看表结构信息

调整列簇的版本数量

删除数据

删除目标1:

        删除数据ID = row3的列簇liecuA中age列的数据(删除操作最小单元)

删除目标2:

        删除数据ID = row3的列簇liecuA 相关数据(如果test表中有多个列粗,那么删除liecuA不会影响row3其他列簇的数据)

删除目标3:

        删除数据ID=row2的所有列簇数据(整条记录删除)


简介:

        增删改查这四个是我们关系型数据库最常用的,通常很多程序员经常调侃自己做的事情就是增删改查。同样使用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 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐