1. 程式人生 > >HBase篇(2)-資料模型與操作

HBase篇(2)-資料模型與操作

HBase其實就是一個數據庫,無非就是儲存和增刪改查,那我們先從資料模型說起把

這裡有一張表,是用關係型資料庫的思維畫出來的表,這樣比較易於理解:

概念

Table(表格)

沒啥說的,和關係型資料庫一樣,由多行組成

Row(行)

包含一個key和一個或者多個列。行按照RowKey字典序儲存在表格中。

Column Family(列族)

可以理解為一組列的集合,HBase官方建議儘量的減少ColumnFamily的數量。

Column Qualifier(列)

一個 Column Family 下面有多個Column Qualifier,

Timestamp(時間戳)

時間戳是寫在值旁邊的一個用於區分值的版本的資料。可以開發者自己指定,預設情況下,時間戳表示的是當資料寫入時RegionSever的時間點。

Cell(單元)

單元是由行、列族、列、值和代表值版本的時間戳組成的。舉個例子:

A  column=CF1:C1_1, timestamp=T1, value=nice

實際模型

上面表的其中一行,在hbase shell 中顯示實際是這樣的。

hbase(main):006:0> scan 'table_name'
ROW                   COLUMN+CELL
A                          column=CF1:C1_1, timestamp=T1, value=nice
A                          column=CF1:C1_2, timestamp=T1, value=handsome
A                          column=CF1:C2_1, timestamp=T1, value=china
A                          column=CF1:C2_2, timestamp=T1, value=guangdong

可見

  • 稀疏列儲存:如果RowKey=B;Column=C1_1 這一格是空的,不會造成儲存空間碎片,只會少存一行
B      column=CF1:C1_1, timestamp=T1, value=nice
  • 新增列方便:只需指定列名列族名,column=CF1:C1_1
  • rowkey字典序排列
  • 每個value都有一個時間戳

操作彙總

注意後方高能,是一些常用的命令,看完可以收藏一波。

增刪改查

**建立表**
create '表名稱', '列族名稱1','列族名稱2','列族名稱N'

**新增記錄/更新記錄**
put '表名稱', '行名稱', '列名稱:', '值'

**檢視記錄**
get '表名稱', '行名稱'

**查看錶中的記錄總數**
count  '表名稱'

**刪除記錄**
delete  '表名' ,'行名稱' , '列名稱'

**刪除一張表**
先要遮蔽該表,才能對該表進行刪除,第一步 disable '表名稱' 第二步  drop '表名稱'

**檢視所有記錄**
scan "表名稱" 

**檢視某個表某個列中所有資料**
scan "表名稱" , {COLUMNS=>'列族名稱:列名稱'}

過濾器

RowFilter

通過rowkey過濾,匹配出rowkey中含uncle的資料。

> scan 'table_name', FILTER=>"RowFilter(=,'substring:uncle')"

通過rowkey過濾,匹配出rowkey等於uncle666的資料。

> scan 'table_name', FILTER=>"RowFilter(=,'binary:uncle666')"

通過rowkey過濾,匹配出rowkey小於等於uncle666的資料。

> scan 'table_name', FILTER=>"RowFilter(<=,'binary:uncle666')"

匹配從rowkey為uncle666開始讀50行

> scan 'table_name',{COLUMNS=>['cf:column'],LIMIT => 50,STARTROW=>'uncle666'}

匹配時間範圍

> scan 'table_name',{COLUMNS=>['cf:column'],LIMIT => 50,TIMERANGE=>'1533530400000,1535930400000'}

PrefixFilter

通過rowkey字首過濾,匹配出rowkey字首為666的資料。

> scan 'table_name', FILTER=>"PrefixFilter('666')"

ValueFilter

通過value過濾,匹配出value含uncle的資料。

> scan 'table_name', FILTER=>"ValueFilter(=,'substring:uncle')"

FamilyFilter

通過列簇過濾,匹配出列簇含f的資料。

> scan 'table_name', FILTER=>"FamilyFilter(=,'substring:f')"