目錄
1 數據模型
1.1?相關名詞概念
1.2 模型分析
2 Hbase Shell操作
2.1 命名空間
2.2 表操作
2.2.1 創建表
2.2.2 更改表結構
2.2.3 表的其他操作
2.3 數據操作
2.3.1 添加數據(put)
2.3.2 刪除數據(delete)
2.3.3 獲取數據(get|scan)
3 過濾器
3.1 比較運算符和比較器
3.2 行鍵過濾器
3.3 列族與列過濾器
3.4 值過濾器
3.5 其他過濾器
1 數據模型
1.1?相關名詞概念
表(Table):類似于關型數據庫中的表
行(Row):以行鍵進行唯一標識,代表一個數據對象,按照字典順序由低到高存儲在表。
列族(Column Family):列的集合,支持動態擴展(無需預定義列的類型及數量,可隨意增刪),所有列默認以字符串形式存儲在表中,用戶可根據需求自行進行數據類型轉換。
列標識(Column Qualifier):沒有固定的數據類型,以二進制字節存儲,對列進行定位。
單元格(Cell):以行鍵、列族、列標識共同確定一個單元格,單元格沒有固定的數據類型,以二進制字節存儲,可用<Row Key,Column Family : Column Qualifier,Timestamp>來訪問。
時間戳(Timestamp):表示數據的版本信息,如不設置默認為當前時間。
1.2 模型分析
?與傳統關型數據庫的區別
關型數據庫 | Hbase |
表結構和數據類型需要預定義 | 表結構和數據類型不需要預定義 |
添加列需要修改表結構 | 支持動態擴展 |
NULL占用存儲空間 | NULL不占用存儲空間 |
面向行存儲 | 面向列存儲 |
2 Hbase Shell操作
2.1 命名空間
????????關型數據庫中的所有表存儲在數據庫中,數據庫作為表的一個邏輯分組。Hbase中存在一種類似與數據庫的表的邏輯分組——命名空間。
list_namespace #查看所有的命名空間create_namespace 'ns' #創建命名空間nslist_namespace_tables 'ns' #查看ns命名空間下的所有表alter_namespace 'ns' #更改命名空間nsdescribe_namespace 'ns' #查看命名空間nsdrop_namespace 'ns' #刪除命名空間ns
2.2 表操作
2.2.1 創建表
????????表名區分大小寫,所有的字符串都必須包含在單引號里。
#創建包含StuInfo,Grades兩個列族的Student表
create 'Student','StuInfo','Grades'#指定參數創建
create 'Student',{NAME => 'StuInfo',VERSION => 3},{NAME => 'Grades',VERSION => 3}
2.2.2 更改表結構
????????在對表進行更改或者刪除時,必須先禁用表,等修改之后必須解禁表。
#增加hobby列族
alter 'Student' , 'hobby'#刪除hobby列族(設置METHOD屬性的值)
alter 'Student' , {NAME => 'hobby' , METHOD => 'delete'}#修改Grades列族(通過修改屬性值實現)
alter 'Student' , {NAME => 'Grades' , VERSION => 3}
2.2.3 表的其他操作
????????Hbase表最少要包含一個列族,當表中只有一個列族的時候將無法刪除該表。
#刪除表
is_disable 'Student' #查詢表是否被禁用
disable 'Student' #設置表使之被禁用
enable 'Student' #解禁表
drop 'Student' #刪除表#清空表中的數據
truncate 'Student'#查看表是否存在
exists 'Student'#查看已有的表名
list#查看表的列族信息
describe 'Student'
2.3 數據操作
2.3.1 添加數據(put)
????????列支持動態擴展可以使之前未定義的值,列族則必須是提前創建好的。
????????put命令一次只能插入一個單元格的數據,單元格存在數據的情況下是修改數據
put 'Student' , '0001' , 'StuInfo:Name' , 'Tom Green' , 1| | | | |表名 行鍵 列族:列 修改后的值 時間戳
2.3.2 刪除數據(delete)
delete操作并不會馬上刪除數據,只是將對應的數據打上刪除標記(tombstone),只有在數據產生合并時,數據才會被刪除。
#刪除列族
刪除Student表里行鍵為0002的Grades列族數據
delete 'Student' , '0002' , 'Grades'#刪除單元格
刪除Student表里行鍵為0001、Grades列族成員為Math,并且時間戳小于等于2的數據
delete 'Student' , '0001' , 'Grades:Math' , 2#刪除一行
刪除Student表里行鍵為0001的一行數據
deleteall 'Student' , '0001'
2.3.3 獲取數據(get|scan)
????????get和scan命令都可以配合參數指定進行查詢想要更加精準的查詢就要配合過濾器進行查詢
#以行鍵為索引條件獲取一行信息
get 'Student' , '0001'#掃描全表的數據
scan 'Student'#配合參數指定查找信息
scan 'Student' , {COLUMN => 'StuInfo'} #指定列族
scan 'Student' , {COLUMN => 'StuInfo:Name'} #指定列
scan 'Student' , {LIMIT => 1} #限制查詢返回的行數
scan 'Student' , {STARTROW => '0001' , ENDROW => '0003'} #限制查詢返回的行范圍
3 過濾器
3.1 比較運算符和比較器
比較運算符 | 描述 | ? ? ?? | 比較器 | 描述 |
= | 等于 | BinaryComparator | 匹配完整字節數組 | |
> | 大于 | BinaryPrefixComparator | 匹配字節數組前綴 | |
>= | 大于等于 | BitComparator | 匹配比特位 | |
< | 小于 | NullParator | 匹配空值 | |
<= | 小于等于 | RegexStringComparator | 匹配正則表達式 | |
!= | 不等于 | SubStringComparator | 匹配子串 |
過濾器語法:scan 'Student' , Filter => "過濾器 (比較運算符 ,?'比較器')"
注意引號的使用(單引還是雙引)
3.2 行鍵過濾器
#RowFilter(行鍵過濾器)
scan 'Student' , Filter => "RowFilter( = , 'substring:0001' )"
scan 'Student' , Filter => "RowFilter( > , 'binary:0001' )"#PrefixFilter(比較行鍵前綴)
查詢行鍵前綴為0001的所有行
scan 'Student' , Filter => "PrefixFilter('0001')"#KeyOnlyFilter(只返回鍵不返回值)
scan 'Student' , Filter => "KeyOnlyFilter()"#FirstKeyOnlyFilter(每行的第一列的數據信息)
scan 'Student' , Filter => "FirstKeyOnlyFilter()"#InclusiveStopFilter(終止行信息)
查詢0001到0002行的數據信息
scan 'Student' , {STARTROW => '0001' , Filter => "InclusiveStopFilter('binary:0002')"}
3.3 列族與列過濾器
#列族過濾器(用法與RowFilter類似)
scan 'Student' , Filter => "FamilyFilter( = , 'substring:Grades' )"#QualifierFilter(列標識過濾器)
scan 'Student' , Filter => "QualifierFilter( = , 'substring:Math' )"#ColumnPrefixFilter(比較列名前綴)
查詢列名前綴為'Ma'的所有行
scan 'Student' , Filter => "ColumnPrefixFilter('Ma')"#MultipleColumnPrefixFilter(指定多個前綴對列名進行過濾)
scan 'Student' , Filter => "MultipleColumnPrefixFilter('Ma','Ag')"#ColumnRangeFilter(按范圍過濾列名左閉右開)
查詢從Big前綴開始到Math前綴的前一列為止的所有數據
scan 'Student' , Filter => "ColumnRangeFilter('Big',true,'Math',false)"
3.4 值過濾器
#ValueFilter(值過值器)
查詢表中所有單元格的值為curry的數據
scan 'Student' , Filter => "ValueFilter( = , 'substring:curry' )"#SingleColumnValueFilter(指定列族和列名的值過濾)
查詢StuInfo列族中的Name列里單元格的值為curry的所有數據
scan 'Student' , Filter => "SingleColumnValueFilter('StuInfo','Name'= ,'substring:curry')"#SingleColumnValueExcludeFilter(指定列族和列名的值過濾)
查詢StuInfo列族中的Name列里除了單元格的值為curry的所有數據
scan 'Student',Filter=>"SingleColumnValueExcludeFilter('StuInfo','Name',=,'substring:curry')"
3.5 其他過濾器
#ColumnCountGetFilter(限制每個行返回的個數,在get方法中使用)
scan 'Student' , Filter => "FamilyFilter( = , 'substring:Grades' )"#TimestampsFilter(時間戳過濾)
scan 'Student' , Filter => "TimestampsFilter(1,4)"#InclusiveStopFilter(設置結束行,STARTROW和ENDROW的組合是左閉右開,STARTROW和InclusiveStopFilter的組合是左閉右閉)
查詢0001到0003行的數據
scan 'Student' , {STARTROW => '0001',Filter => "InclusiveStopFilter('0003')"}#PageFilter(對返回結果進行分頁)
scan 'Student' , {STARTROW => '0001',ENDROW => '0005'Filter => "PageFilter(3)"}#ColumnPaginationFilter(對一行的所有列進行分頁)
scan 'Student' , {STARTROW => '0001',ENDROW => '0005'Filter => "ColumnPaginationFilter(2,1)"}