Hbase高手之路 -- 第四章 -- HBase Shell

Hbase高手之路 – 第四章 – HBase Shell

一、 命令汇总

命令功能命令功能
create创建表count统计行数
put插入或更新数据delete删除指定的行或列的数据
get获取指定行或列的数据deleteall删除整个行或者列的数据
scan扫描表并返回表的数据truncate删除表的数据,结构还在
describe查看表的结构drop删除整个表(包括数据和结构)慎用

二、 需求

有以下订单数据,我们想要将这样的一些数据保存到HBase中。

订单ID订单状态支付金额支付方式ID用户ID操作时间商品分类
001已付款200.510012020-5-2 18:08:53手机;

接下来,我们将使用HBase shell来进行以下操作:

  1. 创建表
  2. 添加数据
  3. 更新数据
  4. 删除数据
  5. 查询数据

三、 基本操作

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) 分析
  1. 因为要订单ID就是ORDER_INFO表的rowkey,所以,我们应该使用rowkey过滤器来过滤
  2. 通过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) 分析
  1. 因为此处要指定列来进行查询,所以,我们不再使用rowkey过滤器,而是要使用列过滤器
  2. 我们要针对指定列和指定值进行过滤,比较适合使用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. 查询支付方式为1
SingleColumnValueFilter('C1', 'PAYWAY', = , 'binary:1')
  1. 查询金额大于3000的订单
SingleColumnValueFilter('C1', 'PAY_MONEY', > , 'binary:3000')
  1. 组合查询
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

清空表的数据,保留表的结构

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值