Hbase常用shell命令


Hbase常用shell命令

1、操作Hbase數據的方式

1、通過shell操作
2、Hive建立外部表操作
3、通過MapReduce操作
4、通過Phoenix操作
5、通過Java API(使用最多)

2、操作Hbase的shell命令

進入到hbase的命令欄
[root@master ~]# hbase shell

進入命令欄后才能操作hbase
注意:在hbase中,刪除----Ctrl+Back
創建
create '表名','列簇名'
舉例:create 'test','info'

注意:
	這種建表默認創建在default命名空間上;
	沒有具體的表結構,沒有約束;
	命名空間類似於數據庫

創建命名空間----create_namespace '空間名'
舉例:cerate_namespace 'ns1'

在指定的命名空間下創建表----create '空間名:表名','列簇名'
舉例:create 'ns1:ns1_tb1','cf1'
查看----listdesc
list:查看除了hbase命名空間以外的其他命名空間下的所有表

查看有哪些命名空間----list_namespace

查看指定的命名空間下的表----list_namespace_tables '空間名'
舉例:list_namespace_tables 'ns1'

查看表的結構(主要是列簇的一些描述)----desc '表名'
刪除----dropdelete
啟動表----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'
注意:當數據是中文的時候,在加載數據的時候,會以二進制的形式存儲;在獲取的時候,顯示的是十六進制
獲取數據----getscan
從表中獲取數據有兩種方式
方式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;
調整該參數可提高查詢速度,根據自己的需求來調整

3、多版本案例說明

  • 建表
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和列簇都一樣

4、表結構分析

#查詢表結構
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'----復制范圍

5、數據的多版本設置

在列簇中的默認版本為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,那么前兩次插入的數據真正意義上並沒被刪除,將會被標記下來


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM