手机网站建设的方法江苏水利工程建设局网站
目录
1、创建表
1.1、启动HBase Shell
1.2、创建表
1.3、查看表
1.4、删除表
2、插入数据
2.1、put命令
3、查看数据
3.1、get命令
3.2、查询数据中文显示
4、更新数据
4.1、使用put来更新数据
5、删除数据
5.1、delete命令
5.2、删除指定列的数据
5.3、deleteall命令删除整行数据
6、清空表
6.1、tuncate命令
7、批量导入数据集
8、扫描操作
8.1、scan命令
8.2、示例1:查询学生表中的所有数据
8.3、示例2:查询学生数据只显示1条
8.4、示例3:查询学生姓名和年龄
8.5、示例4:查询指定学生id的姓名和年龄
9、过滤器
9.1、HBase中的过滤器
9.2、过滤器的使用
9.3、示例1:使用RowFilter查询指定学生id的信息
9.4、示例2:查询在校状态为1,且年龄大于21的学生信息
通过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脚本 
- https://github.com/apache/hbase/tree/branch-2.1/hbase-shell/src/main/ruby/shell/commands
 
 
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文档。 
- Apache HBase 2.2.3 API
 
 
9.1、HBase中的过滤器
- 在HBase的shell中,通过show_filters指令,可以查看到HBase中内置的一些过滤器。
 
show_filters

- 过滤器进行分类
 
|   rowkey 过滤器  |   RowFilter  |   实现行键字符串的比较和过滤  | 
|   PrefixFilter  |   rowkey前缀过滤器  | |
|   KeyOnlyFilter  |   只对单元格的键进行过滤和显示,不显示值  | |
|   FirstKeyOnlyFilter  |   只扫描显示相同键的第一个单元格,其键值对会显示出来  | |
|   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大的
 
 
