目录
[1.1、启动HBase Shell](#1.1、启动HBase Shell)
9.3、示例1:使用RowFilter查询指定学生id的信息
通过shell的方式来维护和管理HBase。例如:执行建表语句、执行增删改查操作等等。
需求: 有以下学生数据,要将这样的一些数据保存到HBase中。
- 下面将使用HBase shell来进行以下操作:
- 1.创建表
- 2.添加数据
- 3.更新数据
- 4.删除数据
- 5.查询数据
1、创建表
- 在HBase中,所有的数据也都是保存在表中的。要将学生数据保存到HBase中,首先需要将表创建出来。
1.1、启动HBase Shell
- HBase的shell其实JRuby的IRB(交互式的Ruby),但在其中添加了一些HBase的命令。
- 启动HBase shell:
hbase shell
1.2、创建表
- 语法:
create '表名','列蔟名'...
- 示例:
-- 创建学生表,表名为student_info,该表有一个列蔟为C1
create 'student_info','C1';
注意:
- create要写成小写
- 一个表可以包含若干个列蔟
- 命令解析:调用hbase提供的ruby脚本的create方法,传递两个字符串参数
- 通过下面文档可以看到每个命令都是一个ruby脚本
1.3、查看表
list
1.4、删除表
- 要删除某个表,必须要先禁用表
1、禁用表
disable "表名"
2、删除表
drop "表名"
示例:删除student_info表
disable "student_info "
drop "student_info"
2、插入数据
往学生表中添加以下数据。
|------|----|----|----|------------|------|
| 学号 | 姓名 | 性别 | 年龄 | 入学时间 | 在校情况 |
| 0001 | 张三 | 男 | 25 | 2023-02-06 | 1 |
2.1、put命令
- HBase中的put命令,可以用来将数据保存到表中。但put一次只能保存一个列的值。以下是put的语法结构:
put '表名','ROWKEY','列蔟名:列名','值'
添加以上数据,需要执行以下操作:
put 'student_info','0001','C1:stuno','0001'
put 'student_info','0001','C1:name','张三'
put 'student_info','0001','C1:sex','男'
put 'student_info','0001','C1:age',25
put 'student_info','0001','C1:enrollment_time','2023-02-06'
put 'student_info','0001','C1:state',1
3、查看数据
3.1、get命令
- 在HBase中,可以使用get命令来获取单独的一行数据。语法:
get '表名','rowkey'
示例:查询指定学生号的数据
get 'student_info','0001'
3.2、查询数据中文显示
- 在HBase shell中,如果在数据中出现了一些中文,默认HBase shell中显示出来的是十六进制编码。要想将这些编码显示为中文,需要在get命令后添加一个属性:{FORMATTER => 'toString'}
get 'student_info','0001', {FORMATTER => 'toString'}
注意:
- { key => value},这个是Ruby语法,表示定义一个HASH结构
- FORMATTER要使用大写
- 在Ruby中用{}表示一个字典,类似于hashtable,FORMATTER表示key、'toString'表示值
4、更新数据
4.1、使用put来更新数据
- 数据存在属于更新操作,数据不存在数据插入操作。
示例:更新张三的年龄为20
put 'student_info', '0001', 'C1:age', 20
注意:
- HBase中会自动维护数据的版本
- 每当执行一次put后,都会重新生成新的时间戳
5、删除数据
- 删除数据的时候,其实HBase不是真的直接把数据删除掉,而是给某个列设置一个标志,然后查询数据的时候,有这个标志的数据,就不显示出来
- 什么时候真正的删除数据呢?
- 后台进程,专门来执行删除数据的操作
5.1、delete命令
- 执行delete的时候
- 如果表中的某个列簇有对一个列存在几次修改,它会删除最近的一次修改
- 默认是保存1个保存的时间戳
- 有一个version属性
- 在HBase中,可以使用delete命令来将一个单元格的数据删除。语法格式如下:
delete '表名', 'rowkey', '列蔟:列'
- 注意:此处HBase默认会保存多个时间戳的版本数据,所以这里的delete删除的是最新版本的列数据。
5.2、删除指定列的数据
delete 'student_info','0001','C1:age'
5.3、deleteall命令删除整行数据
- deleteall命令可以将指定rowkey对应的所有列全部删除。语法:
deleteall '表名','rowkey'
示例:删除rowkey为0001的数据
deleteall 'student_info','0001'
6、清空表
6.1、tuncate命令
- 原理:
- 1、先将表禁用
- 2、然后再删除表
- 3、最后再创建表
- truncate命令用来清空某个表中的所有数据。语法:
truncate "表名"
示例:清空student_info的所有数据
truncate 'student_info'
7、批量导入数据集
- 在数据集/ student_info.txt 中,有一份这样的HBase数据集,我们需要将这些指令放到HBase中执行,将数据导入到HBase中。
- 可以看到这些都是一堆的put语句。那么如何才能将这些语句全部执行呢?
- 1、上传命令文件将该数据集文件上传到指定的目录中
cd /hbase/data
rz
- 2、执行命令
hbase shell /hbase/data/student_info.txt
8、扫描操作
8.1、scan命令
- 在HBase,我们可以使用scan命令来扫描HBase中的表。语法:
scan '表名'
8.2、示例1:查询学生表中的所有数据
注意:scan扫描非常耗时,要避免scan一张大表,生产环境中禁用。
scan 'student_info',{FORMATTER => 'toString'}
8.3、示例2:查询学生数据只显示1条
scan 'student_info', {LIMIT => 1, FORMATTER => 'toString'}
8.4、示例3:查询学生姓名和年龄
scan 'student_info', {COLUMNS => ['C1:name', 'C1:age'], FORMATTER => 'toString'}
- 注意:
- ['C1:name', ...]在Ruby中[]表示一个数组
8.5、示例4:查询指定学生id的姓名和年龄
- 要查询指定ROWKEY的数据,需要使用ROWPREFIXFILTER,用法为:
scan '表名', {ROWPREFIXFILTER => 'rowkey'}
示例实现命令如下:
scan 'student_info', {ROWPREFIXFILTER => '0001', COLUMNS => ['C1:name', 'C1:age'], FORMATTER => 'toString'}
9、过滤器
- 在HBase中,如果要对海量的数据来进行查询,当基本的操作无法实现时。此时,需要借助HBase中的高级语法------Filter来进行查询。Filter可以根据列簇、列、版本等条件来对数据进行过滤查询。
- 因为在HBase中,主键、列、版本都是有序存储的,所以借助Filter,可以高效地完成查询。当执行Filter时,HBase会将Filter分发给各个HBase服务器节点来进行查询。
- HBase中的过滤器也是基于Java开发的,只不过在Shell中,是使用基于JRuby的语法来实现的交互式查询。以下是HBase 2.2的JAVA API文档。
9.1、HBase中的过滤器
- 在HBase的shell中,通过show_filters指令,可以查看到HBase中内置的一些过滤器。
show_filters
- 过滤器进行分类
|------------|--------------------------------|---------------------------------------------|
| rowkey 过滤器 | RowFilter | 实现行键字符串的比较和过滤 |
| rowkey 过滤器 | PrefixFilter | rowkey前缀过滤器 |
| rowkey 过滤器 | KeyOnlyFilter | 只对单元格的键进行过滤和显示,不显示值 |
| rowkey 过滤器 | FirstKeyOnlyFilter | 只扫描显示相同键的第一个单元格,其键值对会显示出来 |
| rowkey 过滤器 | InclusiveStopFilter | 替代 ENDROW 返回终止条件行 |
| 列过滤器 | FamilyFilter | 列簇过滤器 |
| 列过滤器 | QualifierFilter | 列标识过滤器,只显示对应列名的数据 |
| 列过滤器 | ColumnPrefixFilter | 对列名称的前缀进行过滤 |
| 列过滤器 | MultipleColumnPrefixFilter | 可以指定多个前缀对列名称过滤 |
| 列过滤器 | ColumnRangeFilter | 过滤列名称的范围 |
| 值过滤器 | ValueFilter | 值过滤器,找到符合值条件的键值对 |
| 值过滤器 | SingleColumnValueFilter | 在指定的列蔟和列中进行比较的值过滤器 |
| 值过滤器 | SingleColumnValueExcludeFilter | 排除匹配成功的值 |
| 其他过滤器 | ColumnPaginationFilter | 对一行的所有列分页,只返回 [offset,offset+limit] 范围内的列 |
| 其他过滤器 | PageFilter | 对显示结果按行进行分页显示 |
| 其他过滤器 | TimestampsFilter | 时间戳过滤,支持等值,可以设置多个时间戳 |
| 其他过滤器 | ColumnCountGetFilter | 限制每个逻辑行返回键值对的个数,在 get 方法中使用 |
| 其他过滤器 | DependentColumnFilter | 允许用户指定一个参考列或引用列来过滤其他列的过滤器 |
Java API官方地址:Apache HBase 4.0.0-alpha-1-SNAPSHOT API
9.2、过滤器的使用
- 过滤器一般结合scan命令来使用。打开HBase的JAVA API文档。找到RowFilter的构造器说明,可以看到使用格式如下:
scan '表名', { Filter => "过滤器(比较运算符, '比较器表达式')" }
- 比较运算符
|-------|------|
| 比较运算符 | 描述 |
| = | 等于 |
| > | 大于 |
| >= | 大于等于 |
| < | 小于 |
| <= | 小于等于 |
| != | 不等于 |
- 比较器
|------------------------|----------|
| 比较器 | 描述 |
| BinaryComparator | 匹配完整字节数组 |
| BinaryPrefixComparator | 匹配字节数组前缀 |
| BitComparator | 匹配比特位 |
| NullComparator | 匹配空值 |
| RegexStringComparator | 匹配正则表达式 |
| SubstringComparator | 匹配子字符串 |
- 比较器表达式
- 基本语法:比较器类型:比较器的值
|------------------------|-------------------|
| 比较器 | 表达式语言缩写 |
| BinaryComparator | binary:值 |
| BinaryPrefixComparator | binaryprefix:值 |
| BitComparator | bit:值 |
| NullComparator | null |
| RegexStringComparator | regexstring:正则表达式 |
| SubstringComparator | substring:值 |
9.3、示例1:使用RowFilter查询指定学生id的信息
分析:
- 1.因为要学生id就是student_info表的rowkey,所以,应该使用rowkey过滤器来过滤
- 2.通过HBase的JAVA API,找到RowFilter构造器
- 通过上图,可以分析得到,RowFilter过滤器接受两个参数,
- op------比较运算符
- rowComparator------比较器
- 所以构建该Filter的时候,只需要传入两个参数即可
实现命令如下:
scan 'student_info', {FILTER => "RowFilter(=,'binary:0001')"}
9.4、示例2:查询在校状态为1,且年龄大于21的学生信息
- 1**、查询在校状态为1**
SingleColumnValueFilter('C1', 'state', = , 'binary:1')
- 2、查询年龄大于21的学生信息
SingleColumnValueFilter('C1', 'age', > , 'binary:21')
- 特别注意:使用SingleColumnValueFilter过滤器要过滤的列必须存在,如果不存在,那么这些列不存在的数据也会返回。如果不想让这些数据返回,做如下设置即可
SingleColumnValueFilter('C1', 'age', > , 'binary:21',true, true)
- 3、组合查询
scan 'student_info', {FILTER => "SingleColumnValueFilter('C1', 'state', = , 'binary:1') AND SingleColumnValueFilter('C1', 'age', > , 'binary:21')", FORMATTER => 'toString'}
- 注意:
- HBase shell中比较默认都是字符串比较,所以如果是比较数值类型的,会出现不准确的情况
- 例如:在字符串比较中3是比21大的