Hbase数据模型及Hbase Shell

举报
扎哇太枣糕 发表于 2022/05/07 20:19:26 2022/05/07
【摘要】 ​目录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...

目录

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'             #创建命名空间ns

list_namespace_tables 'ns'        #查看ns命名空间下的所有表

alter_namespace 'ns'              #更改命名空间ns

describe_namespace 'ns'           #查看命名空间ns

drop_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)"}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。