1. 程式人生 > 其它 >【HBase】操作 HBase 的必會命令(圖示詳解)

【HBase】操作 HBase 的必會命令(圖示詳解)

技術標籤:資料儲存hbase

1.基本命令

  • 啟動 HBase:./start-hbase.sh

  • 檢視 HBase 是否啟動:jps(注:docker 容器內沒有該命令)

  • 進入 HBase 的客戶端:./hbase shell

2.名稱空間

1)建立名稱空間

create_namespace '名稱空間'

在這裡插入圖片描述

2)檢視名稱空間

list_nameapce

在這裡插入圖片描述

注:HBase系統預設定義了兩個預設的namespace

  • hbase:系統內建表,包括namespace和meta表
  • default:使用者建表時未指定namespace的表都建立在此

3)刪除名稱空間

drop_namespace ‘名稱空間'

在這裡插入圖片描述

3.表相關

1)建立表(重點)

create '名稱空間:表名',{NAME => ’列族名‘, VERSION => '版本數', TTL => '過期時間', BLOOMFILTER => '布隆過濾器'...}

注:HBase 是列族式資料庫,在建立資料表時,需要指定的是列族和列屬性,而不像 MySQL 設定的是具體列。列族與列的關係是,一個列族由多個列構成,列名都以列族名作為字首。例如java:springjava:netty都屬於java這個列族。

所以,上面的 NAME 設定的是列族名,VERSION、TTL、BLOOMFILTER 是幾個比較重要的列屬性,所以建立表時單列出來(注:它們都是有預設值的)。

舉個例子,建立一個有兩個列族(baseInfo,otherInfo)的 user 表:

create_namespace 'test'
  	
create 'test:user', {NAME => 'b', VERSIONS => '3', TTL => '2147483647', 'BLOOMFILTER' => 'ROW'}, 
					{NAME => 'o', VERSIONS => '3', TTL => '2147483647', 'BLOOMFILTER' => 'ROW'}

# 意思是,在 test 名稱空間下建立 user 表,表中有兩個列族,分別是列 b 和 o,版本有3個,過期時間 2147483647,布隆過濾器過濾依據是 RowKey。

在這裡插入圖片描述
另外,我們在 web 控制檯也能看到表資訊

在這裡插入圖片描述

2)查看錶結構(列族、列)

desc '名稱空間:表名'

在這裡插入圖片描述
可以看到,有兩個列族,另外那些沒有設值的列屬性都被附上了預設值。

3)檢視名稱空間下的表

list_namespace_tables '名稱空間'

在這裡插入圖片描述

4)刪除表

disable 'test:user' # 刪除前要先禁用表
drop 'test:user' 	# 執行刪除

在這裡插入圖片描述

4.資料操作(重點)

1)掃描表中資料

scan '名稱空間:表名'

上面新建了 user 表,還沒有新增過資料,所以,可想而知,查詢結果為空:

在這裡插入圖片描述

2)新增資料

put ‘名稱空間:表名’, 'RowKey', '列族:列', '具體值'

注:HBase 是列族式資料庫,所以是在真正新增資料時才指定有哪些列

舉個例子,我們向上面的 user 表的 b 列族(baseInfo)中建立一個 name 列,在 o 列族(otherInfo)中建立一個 phone 列,並賦上具體值:

put 'test:user','1', 'b:name', 'zhangsan'
put 'test:user','1', 'o:phone', '12345678919'

在這裡插入圖片描述
再來查詢一下,就可以看到剛才新增的資料了:

在這裡插入圖片描述
問題一:上面是相同 RowKey,那如果 RowKey 不同呢?

我們再來新增一條不是同一個 RowKey 的資料,看看會是什麼樣

put 'test:user','2', 'b:name', 'lisi' 

在這裡插入圖片描述

問題二:在建表時不是我們不是設定了 Version=3 嗎,那這裡是不是說我的 b:name 可以儲存三個值?

是的。所以我們再來給 RowKey=1 的這一行的 b:name 再來新增兩個資料

put 'test:user','1', 'b:name', 'wangwu'
put 'test:user','1', 'b:name', 'zhaoliu'

在這裡插入圖片描述
為什麼新增後我再 scan 看不到新增的資料呢?…向下看

3)獲取資料

get '名稱空間:表名', 'RowKey' 						 # 獲取指定行鍵的資料
get '名稱空間:表名', 'RowKey', {COLUMN => '列族:列'}    # 獲取指定行鍵的指定列的資料
get '名稱空間:表名', 'RowKey', {COLUMN => '列族:列', VERSIONS => n}   # 獲取指定行鍵的指定列的資料,顯示n個版本

1.我們先來看獲取 n 個版本的資料

get 'test:user', '1', {COLUMN => 'b:name', VERSIONS => 3} # 注:建表時設定的 3,即使你這寫個 4,也只能返回三行資料

在這裡插入圖片描述
可以看到,果然是我們之前設定的張三、李四、王五,它們按照倒序的方式排列。

2.再來看獲取指定行鍵的資料,查詢 RowKey = 1 的資料:

get 'test:user', '1'

在這裡插入圖片描述
可以看到,如果直接獲取的話,返回的是時間戳最小(新)的資料。

3.獲取指定行鍵的指定列的資料,查詢 RowKey = 1 的 b:name 的資料:

get 'test:user', '1', {COLUMN => 'b:name'}

在這裡插入圖片描述
同樣是獲取到最新的版本。

4)更新資料

更新其實就是新增,如果此時資料個數到達 Version 數了,前面最老的版本淘汰了,或者說就被更新替換了

put ‘名稱空間:表名’, 'RowKey', '列族:列', 'NewValue' 

比如我們要將上面 RowKey 為 1 的 b:name 修改為 Jack,那麼 zhangsan 應該就沒了

put 'test:user', '1', 'b:name', 'Jack'

在這裡插入圖片描述

5)刪除資料

delete '名稱空間:表名', 'RowKey', '列族:列', 時間戳(注:如果不指定時間戳,則預設刪除最新版本)

比如我們去刪除 user 表中 RowKey=1 的 b:name = zhaoliu:

delete 'test:user', '1', 'b:name', 1611678810121 # 注:如果指定時間戳,刪除的就是 Jack

在這裡插入圖片描述
可以看到,刪除 zhaoliu 後,原來被更新後擠走的 zhangsan 的回來了。

6)清空表中資料

truncate` '名稱空間:表名' # 三步:1.禁用 2.刪除 3.重建

在這裡插入圖片描述

注:HBase 的指令碼是.hsh,跟.sql一個意思。