Hbase高手之路 – 第四章 – HBase Shell
一、 命令汇总
命令 | 功能 | 命令 | 功能 |
---|---|---|---|
create | 创建表 | count | 统计行数 |
put | 插入或更新数据 | delete | 删除指定的行或列的数据 |
get | 获取指定行或列的数据 | deleteall | 删除整个行或者列的数据 |
scan | 扫描表并返回表的数据 | truncate | 删除表的数据,结构还在 |
describe | 查看表的结构 | drop | 删除整个表(包括数据和结构)慎用 |
二、 需求
有以下订单数据,我们想要将这样的一些数据保存到HBase中。
订单ID | 订单状态 | 支付金额 | 支付方式ID | 用户ID | 操作时间 | 商品分类 |
---|---|---|---|---|---|---|
001 | 已付款 | 200.5 | 1 | 001 | 2020-5-2 18:08:53 | 手机; |
接下来,我们将使用HBase shell来进行以下操作:
- 创建表
- 添加数据
- 更新数据
- 删除数据
- 查询数据
三、 基本操作
1. 创建表
语法:
create '表名','列蔟名'...
创建订单表,表名为orders,该表有一个列蔟为info
create 'orders','info';
注意:
- create要写成小写
- 一个表可以包含若干个列蔟
- 命令解析:调用hbase提供的ruby脚本的create方法,传递两个字符串参数
- 通过下面链接可以看到每个命令都是一个ruby脚本
https://github.com/apache/hbase/tree/branch-2.1/hbase-shell/src/main/ruby/shell/commands
2. 查看表
语法:
list
describe ‘表名’
3. 删除表
要删除某个表,必须要先禁用表
1) 禁用表
语法:
disable ‘表名’
2) 启用表
语法:
enable ‘表名’
3) 删除表(连结构一起删除)
语法:
drop ‘表名’
四、 数据操作
1. 添加数据
语法:
put ‘表名’,’rowkey’,’列簇名:列名’,’值’
put 'orders','000001','info:id','001'
2. 获取(查看)数据
语法:
get ‘表名’,’rowkey’
get 'orders','000001'
注意:
在HBase shell中,如果在数据中出现了一些中文,默认HBase shell中显示出来的是十六进制编码。要想将这些编码显示为中文,我们需要在get命令后添加一个属性:
{FORMATTER => 'toString'}
3. 更新(修改)数据
语法:
put ‘表名’,’rowkey’,’列簇名:列名’,’新值’
put 'orders', '000001','info:pay_type',2
注意:
- 在HBase中会自动维护表中数据的版本
- 每执行一次put操作,都会生成新的时间戳
4. 删除数据
1) 删除指定的列
语法:
delete ‘表名’,’rowkey’,’列簇名:列名’
注意:此处HBase默认会保存多个时间戳的版本数据,所以这里的delete删除的是最新版本的列数据。
2) 删除整行数据
语法:
deleteall ‘表名’,’rowkey’
deleteall 'orders','000001'
说明:
HBase删除数据时,其实并不是真的删除,而是给数据做一个删除标志,再查询数据的时候不显示出来。
3) 清空表
语法:
truncate ‘表名’
truncate 'orders'
五、 数据的导入
1. 数据文件的准备
模拟某系统产生日志数据文件,把这些数据文件导入到hbase中
2. 上传数据文件到服务器
3. 创建表
4. 执行命令导入数据文件
5. 查看数据
六、 计数操作
统计表中共有多少条记录
1. 计数命令
语法:
count ‘表名’
注意:
当数据量很大的时候,这个操作比较耗时
2. MR程序计算
当数据量很大很大时,可以通过HBase提供的MR程序来运行计数统计。
语法:
hbase org.apache.hadoop.hbase.mapreduce.RowCounter ‘表名’
注意:
- 启动yarn集群
- 启动历史服务器,命令:mapred --daemon start historyserver
hbase org.apache.hadoop.hbase.mapreduce.RowCounter "ORDER_INFO"
七、 扫描操作
1. 全表扫描
语法:
scan ‘表名’,{FORMATTER=>’toString’}
scan "ORDER_INFO",{FORMATTER=>'toString'}
注意:
尽量避免全表扫描一张很大很大的表
2. 限定记录数
语法:
scan ‘表名’,{FORMATTER=>'toString',LIMIT=>数字}
scan "ORDER_INFO",{FORMATTER=>'toString',LIMIT=>2}
3. 限定列
语法:
scan "ORDER_INFO",{FORMATTER=>'toString',COLUMNS=>[‘列簇名1:列名1’,’列簇名1:列名2’,……]}
scan "ORDER_INFO",{FORMATTER=>'toString',LIMIT=>2,COLUMNS=>['C1:PAYWAY','C1:STATUS']}
4. 限定rowkey
语法:
scan "ORDER_INFO",{ROWPREFIXFILTER=>’rowkey’}
scan "ORDER_INFO",{FORMATTER=>'toString',COLUMNS=>['C1:PAYWAY','C1:STATUS'],ROWPREFIXFILTER=>'0'}
八、 过滤器(FILTER)
1. 简介
在HBase中,如果要对海量的数据来进行查询,此时基本的操作是比较无力的。此时,需要借助HBase中的高级语法——Filter来进行查询。Filter可以根据列簇、列、版本等条件来对数据进行过滤查询。因为在HBase中,主键、列、版本都是有序存储的,所以借助Filter,可以高效地完成查询。当执行Filter时,HBase会将Filter分发给各个HBase服务器节点来进行查询。
HBase中的过滤器也是基于Java开发的,只不过在Shell中,我们是使用基于JRuby的语法来实现的交互式查询。以下是HBase 2.2的JAVA API文档。
http://hbase.apache.org/2.2/devapidocs/index.html
2. 过滤器
可以通过show_filters命令,来查看HBase内置的过滤器
Java API官方地址:https://hbase.apache.org/devapidocs/index.html
3. 过滤器的用法
过滤器一般结合scan命令来使用,语法:
scan ‘表名’,{FILTER=>”过滤器(比较运算符,’比较器表达式’)”}
举例:
需求一:查询指定订单的数据,订单号为“02602f66-adc7-40d4-8485-76b5632b5b53”
scan 'ORDER_INFO',{FORMATTER=>'toString',FILTER=>"RowFilter(=,'binary:02602f66-adc7-40d4-8485-76b5632b5b53')"}
1) 比较运算符
2) 比较器
3) 比较器表达式
基本语法:比较器类型:比较器的值
4. 案例一:使用RowFilter查询指定订单id的数据
1) 需求:
查询指定订单的数据,订单号为“02602f66-adc7-40d4-8485-76b5632b5b53”、订单状态及支付方式
2) 分析
- 因为要订单ID就是ORDER_INFO表的rowkey,所以,我们应该使用rowkey过滤器来过滤
- 通过HBase的JAVA API,找到RowFilter构造器
通过上图,可以分析得到,RowFilter过滤器接受两个参数,
- op——比较运算符
- rowComparator——比较器
所以构建该Filter的时候,只需要传入两个参数即可
3) 命令
scan 'ORDER_INFO',{FORMATTER=>'toString',FILTER=>"RowFilter(=,'binary:02602f66-adc7-40d4-8485-76b5632b5b53')",COLUMNS=>['C1:PAYWAY','C1:STATUS']}
5. 案例二:查询状态为已付款的订单
1) 需求:
查询状态为已付款的订单
2) 分析
- 因为此处要指定列来进行查询,所以,我们不再使用rowkey过滤器,而是要使用列过滤器
- 我们要针对指定列和指定值进行过滤,比较适合使用SingleColumnValueFilter过滤器,查看JAVA API
需要传入四个参数:
- 列簇
- 列标识(列名)
- 比较运算符
- 比较器
注意:
- 列名STATUS的大小写一定要对!此处使用的是大写!
- 列名写错了查不出来数据,但HBase不会报错,因为HBase是无模式的
3) 命令:
scan 'ORDER_INFO',{FORMATTER=>'toString',FILTER=>"SingleColumnValueFilter('C1','STATUS',=,'binary:已付款')"}
6. 案例三:组合多条件过滤
1) 需求
查询支付方式为1,且金额大于3000的订单
2) 分析
- 此处需要使用多个过滤器共同来实现查询,多个过滤器,可以使用AND或者OR来组合多个过滤器完成查询
- 使用SingleColumnValueFilter实现对应列的查询
3) 命令
- 查询支付方式为1
SingleColumnValueFilter('C1', 'PAYWAY', = , 'binary:1')
- 查询金额大于3000的订单
SingleColumnValueFilter('C1', 'PAY_MONEY', > , 'binary:3000')
- 组合查询
scan 'ORDER_INFO', {FILTER => "SingleColumnValueFilter('C1', 'PAYWAY', = , 'binary:1') AND SingleColumnValueFilter('C1', 'PAY_MONEY', > , 'binary:3000')", FORMATTER => 'toString'}
九、 INCR
1. 需求
某新闻APP应用为了统计每个新闻的每隔一段时间的访问次数,他们将这些数据保存在HBase中。
该表格数据如下所示:
要求:原子性增加新闻的访问次数值。
2. incr操作简介
incr可以实现对某个单元格的值进行原子性计数。语法如下:
incr ‘表名’,‘rowkey’,‘列蔟:列名’,累加值(默认累加1)
- 如果某一列要实现计数功能,必须要使用incr来创建对应的列
- 使用put创建的列是不能实现累加的
3. 导入测试数据
该脚本创建了一个表,名为NEWS_VISIT_CNT,列蔟为C1。并使用incr创建了若干个计数器,每个rowkey为:新闻的编号_时间段。CNT为count的缩写,表示访问的次数。
导入hbase
显示前五条数据
4. 获取计数器的值命令
语法:
get_counter,’表名’,’rowkey’,’列簇:列名’
get_counter "NEWS_VISIT_CNT",'0000000001_00:00-01:00','C1:CNT'
5. 使用incr进行累加操作
incr 'NEWS_VISIT_CNT','0000000001_00:00-01:00','C1:CNT'
十、 shell管理操作
1. status
显示服务器的状态
2. whoami
显示当前用户
3. list
显示当前所有的表
4. count
统计指定表的记录数
5. describe
显示表的结构信息
6. exists
判断某个表是否存,适用于表很多的时候
7. is_enabled、is_disabled
判断表是否启用或禁用
8. alter
改变表和列簇的模式
9. disable和enable
禁用和启动表
10. drop
删除一张表,记得在删除表之前必须先禁用
11. truncate
清空表的数据,保留表的结构