目录
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语句。那么如何才能将这些语句全部执行呢?
cd /hbase/data
rz
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
| 实现行键字符串的比力和过滤
| 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的学生信息
SingleColumnValueFilter('C1', 'state', = , 'binary:1')
SingleColumnValueFilter('C1', 'age', > , 'binary:21')
- 特别注意:使用SingleColumnValueFilter过滤器要过滤的列必须存在,假如不存在,那么这些列不存在的数据也会返回。假如不想让这些数据返回,做如下设置即可
SingleColumnValueFilter('C1', 'age', > , 'binary:21',true, true)
scan 'student_info', {FILTER => "SingleColumnValueFilter('C1', 'state', = , 'binary:1') AND SingleColumnValueFilter('C1', 'age', > , 'binary:21')", FORMATTER => 'toString'}
- 注意:
- HBase shell中比力默认都是字符串比力,以是假如是比力数值类型的,会出现不准确的情况
- 例如:在字符串比力中3是比21大的
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |