Hbase数据模型及Hbase Shell

简介: Hbase数据模型及Hbase Shell

1 数据模型

1.1 相关名词概念

表(Table):类似于关型数据库中的表


行(Row):以行键进行唯一标识,代表一个数据对象,按照字典顺序由低到高存储在表。


列族(Column Family):列的集合,支持动态扩展(无需预定义列的类型及数量,可随意增删),所有列默认以字符串形式存储在表中,用户可根据需求自行进行数据类型转换。


列标识(Column Qualifier):没有固定的数据类型,以二进制字节存储,对列进行定位。


单元格(Cell):以行键、列族、列标识共同确定一个单元格,单元格没有固定的数据类型,以二进制字节存储,可用<Row Key,Column Family : Column Qualifier,Timestamp>来访问。


时间戳(Timestamp):表示数据的版本信息,如不设置默认为当前时间。


1.2 模型分析

image.png


与传统关型数据库的区别


关型数据库 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 匹配子串


注意引号的使用(单引还是双引)


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


相关文章
|
缓存 监控 Shell
如何使用 HBase Shell 进行数据的实时监控和备份?
如何使用 HBase Shell 进行数据的实时监控和备份?
459 5
|
Shell 分布式数据库 Hbase
如何使用 HBase Shell 进行数据的批量导入和导出?
如何使用 HBase Shell 进行数据的批量导入和导出?
1439 5
|
分布式计算 Hadoop Shell
Hadoop-35 HBase 集群配置和启动 3节点云服务器 集群效果测试 Shell测试
Hadoop-35 HBase 集群配置和启动 3节点云服务器 集群效果测试 Shell测试
464 4
|
分布式计算 Hadoop Shell
Hadoop-36 HBase 3节点云服务器集群 HBase Shell 增删改查 全程多图详细 列族 row key value filter
Hadoop-36 HBase 3节点云服务器集群 HBase Shell 增删改查 全程多图详细 列族 row key value filter
351 3
|
10月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
884 9
|
关系型数据库 MySQL Shell
MySQL 备份 Shell 脚本:支持远程同步与阿里云 OSS 备份
一款自动化 MySQL 备份 Shell 脚本,支持本地存储、远程服务器同步(SSH+rsync)、阿里云 OSS 备份,并自动清理过期备份。适用于数据库管理员和开发者,帮助确保数据安全。
|
10月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
956 2
|
Shell
Shell脚本循环控制:shift、continue、break、exit指令
使用这些命令可以让你的Shell脚本像有生命一样动起来。正确使用它们,你的脚本就能像一场精心编排的舞蹈剧目,既有旋律的起伏,也有节奏的跳跃,最终以一场惊艳的表演结束。每一个动作、每一个转折点,都准确、优雅地完成所需要表达的逻辑。如此,你的脚本不只是冰冷的代码,它透过终端的界面,跳着有节奏的舞蹈,走进观众——使用者的心中。
422 60
|
10月前
|
数据采集 监控 Shell
无需Python:Shell脚本如何成为你的自动化爬虫引擎?
Shell脚本利用curl/wget发起请求,结合文本处理工具构建轻量级爬虫,支持并行加速、定时任务、增量抓取及分布式部署。通过随机UA、异常重试等优化提升稳定性,适用于日志监控、价格追踪等场景。相比Python,具备启动快、资源占用低的优势,适合嵌入式或老旧服务器环境,复杂任务可结合Python实现混合编程。
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
1282 1