目录
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)"}