list
、desc
drop
、delete
put
get
、scan
1、通过shell操作 2、Hive建立外部表操作 3、通过MapReduce操作 4、通过Phoenix操作 5、通过Java API(使用最多)
[root@master ~]# hbase shell 进入命令栏后才能操作hbase 注意:在hbase中,删除----Ctrl+Back
create '表名','列簇名' 举例:create 'test','info' 注意: 这种建表默认创建在default命名空间上; 没有具体的表结构,没有约束; 命名空间类似于数据库 创建命名空间----create_namespace '空间名' 举例:cerate_namespace 'ns1' 在指定的命名空间下创建表----create '空间名:表名','列簇名' 举例:create 'ns1:ns1_tb1','cf1'
list
、desc
list:查看除了hbase命名空间以外的其他命名空间下的所有表 查看有哪些命名空间----list_namespace 查看指定的命名空间下的表----list_namespace_tables '空间名' 举例:list_namespace_tables 'ns1' 查看表的结构(主要是列簇的一些描述)----desc '表名'
drop
、delete
启动表----enabled '表名' 禁用表----disable '表名' 删除表,删除之前要将表的状态调成禁用 举例: 先禁用 disable 'ns1:ns1_tb1' 再删除 drop 'ns1:ns1_tb1'
删除表中的数据:删除列 delete '表名','rk','列簇名:列名' 注意:当列有多版本时,获取数据的时候,获取的是最新版本的(原来的数据还在,只是被覆盖掉了) 删除数据的时候,会先将最老的版本删除掉 删除表中的数据:删除列簇=删除所有的列 deleteall '表名', 'rk' 删除表中的所有数据:清空表 truncate '表名' 注意:truncate删除表所有数据的时候,表的预分区会被重置成一个分区
删除指定的列簇: alter '表名','delete'=>'列簇名' 增加新的列簇: alter '表名',NAME=>'列簇名'
put
向表中加载数据 put '表名','rowkey','列簇名:列名','数据' 举例:put 'test','000','info:name','zhaosi' 注意:当数据是中文的时候,在加载数据的时候,会以二进制的形式存储;在获取的时候,显示的是十六进制
get
、scan
从表中获取数据有两种方式 方式1:使用get和指定的rk,获取一条数据 方式2:使用scan获取表的全部数据 方式1:get '表名','rowkey' 举例: get 'test','000'
方式2:scan '表名',{LIMIT=>m}-----指定limit为m条,数据一般都是千万级别的,一定要指定limit 举例:scan 'test',{LIMIT=>2}-----获取前两条 范围查询 STARTROW(开始rowkey) ENDROW(结束rowkey) scan '表名',{STARTROW=>'row1',ENDROW=>'row2'}----------左闭右开 scan '表名',{STARTROW=>'row1',ENDROW=>'row2',LIMIT=>m}
scan全盘扫描获取数据,根据rk按照字典排序
一一例举出来
插入数据 put 'test','0','info:id',0 put 'test','000','info:name',zhaosi put 'test','001','info:name',zhangsan put 'test','002','info:name','lisi' put 'test','003','info:name','wangwu' put 'test','1','info:id',1 put 'test','2','info:id',2 put 'test','3','info:id',3 put 'test','10','info:id',10 获取数据 scan 'test' 结果 ROW COLUMN+CELL 0 column=info:id, timestamp=1645891312403, value=0 000 column=info:age, timestamp=1645874985339, value=22 000 column=info:name, timestamp=1645864553447, value=zhaosi 001 column=info:name, timestamp=1645891607389, value=zhangsan 002 column=info:name, timestamp=1645891642306, value=lisi 003 column=info:name, timestamp=1645891655893, value=wangwu 1 column=info:id, timestamp=1645891312893, value=1 10 column=info:id, timestamp=1645891316123, value=10 2 column=info:id, timestamp=1645891312947, value=2 3 column=info:id, timestamp=1645891313020, value=3 #在排序时,首先按照rk进行升序排序;当rk相等,就按照列簇和列名的大小进行升序排序; 当rk和列簇列名一样时,按照版本的时间戳进行自然降序排序,三个排序成为三维有序
exists '表名' 举例:exists 'test' 结果: Table test does exist 0 row(s) in 0.7120 seconds 举例:exists 'test5' 结果: Table test5 does not exist 0 row(s) in 0.0240 seconds
count '表名' {INTERVAL =>m, CACHE =>n} INTERVAL表示多少行显示一次及对应的rowkey,默认1000; CACHE每次去取的缓存区大小,默认是10; 调整该参数可提高查询速度,根据自己的需求来调整
create 'test','info'
put 'test','000','inf0:name','zhaosi' 注意: 加载数据的时候要自行设定rowkey 指定列簇名,并设定列名
get 'test','000' #结果 COLUMN CELL info:name timestamp=1645864553447, value=zhaosi 1 row(s) in 0.0150 seconds #解释 在Hbase中每个数据都是k-v格式,k表示的是rowkey,本例中是000 v有自己的列名,列名统一归于列簇,表示为 列簇名:列名,本例中是 info:name v的最终数据存放在CELL(单元格)中,每次存放的时候都会产生一个时间戳。 时间戳的目的:(1)产生存放记录 (2)使CELL可以存放多版本数据
put 'test','000','info:age',24
get 'test','000' #结果 COLUMN CELL info:age timestamp=1645865582802, value=24 info:name timestamp=1645864553447, value=zhaosi 1 row(s) in 0.0230 seconds #解释 由结果我们可以看到,先后两次插入数据,再次获取数据,得到的是两行数据, 其实这两行数据算是一条数据,以为两次插入的属于rowkey是一样的; 想要查看表里有几条数据,查看有几个rk就行了
put 'test','000','info:age',23
get 'test','000'、 #结果 COLUMN CELL info:age timestamp=1645874985339, value=22 info:name timestamp=1645864553447, value=zhaosi 1 row(s) in 0.0210 seconds #解释 由此可见,此次添加的数据将原来的数据给覆盖掉了,因为他们的rk和列簇都一样
#查询表结构 hbase(main):005:0> desc 'test' Table test is ENABLED test COLUMN FAMILIES DESCRIPTION {NAME => 'info', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETE D_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE ', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'} 1 row(s) in 0.1260 seconds #分析 1、查询Hbase表结构的时候,主要显示的是对列簇的一些描述 2、COLUMN FAMILIES DESCRIPTION----列簇的一些描述 3、NAME => 'info'----列簇名 4、BLOOMFILTER => 'ROW'----布卢姆过滤器 5、VERSIONS => '1'----表示版本 6、IN_MEMORY => 'false'----是否放在内存中 7、KEEP_DELETED_CELLS => 'FALSE'----是否保留删除的单元格 8、DATA_BLOCK_ENCODING => 'NONE'----数据块编码 9、TTL => 'FOREVER'----存活时间‘永远’ 10、COMPRESSION => 'NONE----压缩 11、MIN_VERSIONS => '0'----最小版本 12、BLOCKCACHE => 'true'----块缓存 13、BLOCKSIZE => '65536'----阻碍 14、REPLICATION_SCOPE => '0'----复制范围
在列簇中的默认版本为1:VERSIONS => '1', 当rk、列簇名、列名一样时,多次传入不同的数据, 最终只会显示最后一次插入的数据,就是因为默认版本为1. 我们可以通过命令,在创建表的时候,修改列簇的默认版本 create '表名',{NAME=>'列簇名',VERSIONS=>'n'} n表示我们想要设置的版本号,n=5,说明最多可以保存5个版本 想要获取多版本数据,要加上{COLUMN=>'列簇名',VERSIONS=>'m'} 版本号m,表示想要获取m个版本的数据 get '表名','rk',{COLUMN=>'列簇名',VERSIONS=>'m'} 注意: 当获取数据的时候,不加上{COLUMN=>'列簇名',VERSIONS=>'m'},获取的是最后插入的一个数据
建表,并设置数据版本为3 create 'test1',{NAME=>'info',VERSIONS=>'3'} 插入数据 put 'test1','000','info:age',18 put 'test1','000','info:age',19 put 'test1','000','info:age',20 put 'test1','000','info:age',21 put 'test1','000','info:age',22 获取数据 get 'test1','000',{COLUMN=>'info',VERSIONS=>2} 结果 COLUMN CELL info:age timestamp=1645879728158, value=22 info:age timestamp=1645879723180, value=21 1 row(s) in 0.0350 seconds 注意: (1)获取的版本号,如果大于我们设置的版本数量,不会报错,但是最多只能显示我们设置的版本数量 (2)我们插入了5条数据,版本数量为3,那么前两次插入的数据真正意义上并没被删除,将会被标记下来