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

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. 创建表
  2. 添加数据
  3. 更新数据
  4. 删除数据
  5. 查询数据

三、 基本操作

1. 创建表

语法:

create '表名','列蔟名'...

创建订单表,表名为orders,该表有一个列蔟为info

create 'orders','info';

Hbase高手之路 -- 第四章 -- HBase Shell_第1张图片

注意:

  • create要写成小写
  • 一个表可以包含若干个列蔟
  • 命令解析:调用hbase提供的ruby脚本的create方法,传递两个字符串参数
  • 通过下面链接可以看到每个命令都是一个ruby脚本

https://github.com/apache/hbase/tree/branch-2.1/hbase-shell/src/main/ruby/shell/commands

2. 查看表

语法:

list

Hbase高手之路 -- 第四章 -- HBase Shell_第2张图片

describe ‘表名’

Hbase高手之路 -- 第四章 -- HBase Shell_第3张图片

3. 删除表

要删除某个表,必须要先禁用表
Hbase高手之路 -- 第四章 -- HBase Shell_第4张图片

1) 禁用表

语法:

disable ‘表名’

Hbase高手之路 -- 第四章 -- HBase Shell_第5张图片

2) 启用表

语法:

enable ‘表名’

Hbase高手之路 -- 第四章 -- HBase Shell_第6张图片

3) 删除表(连结构一起删除)

语法:

drop ‘表名’

Hbase高手之路 -- 第四章 -- HBase Shell_第7张图片

四、 数据操作

1. 添加数据

语法:

put ‘表名’,’rowkey’,’列簇名:列名’,’值’
put 'orders','000001','info:id','001'

Hbase高手之路 -- 第四章 -- HBase Shell_第8张图片
Hbase高手之路 -- 第四章 -- HBase Shell_第9张图片

2. 获取(查看)数据

语法:

get ‘表名’,’rowkey’
get 'orders','000001'

Hbase高手之路 -- 第四章 -- HBase Shell_第10张图片

注意:
在HBase shell中,如果在数据中出现了一些中文,默认HBase shell中显示出来的是十六进制编码。要想将这些编码显示为中文,我们需要在get命令后添加一个属性:
{FORMATTER => 'toString'}
Hbase高手之路 -- 第四章 -- HBase Shell_第11张图片

3. 更新(修改)数据

语法:

put ‘表名’,’rowkey’,’列簇名:列名’,’新值’
put 'orders', '000001','info:pay_type',2

Hbase高手之路 -- 第四章 -- HBase Shell_第12张图片
注意

  • 在HBase中会自动维护表中数据的版本
  • 每执行一次put操作,都会生成新的时间戳

4. 删除数据

1) 删除指定的列

语法:

delete ‘表名’,’rowkey’,’列簇名:列名’

注意:此处HBase默认会保存多个时间戳的版本数据,所以这里的delete删除的是最新版本的列数据。

Hbase高手之路 -- 第四章 -- HBase Shell_第13张图片

Hbase高手之路 -- 第四章 -- HBase Shell_第14张图片

2) 删除整行数据

语法:

deleteall ‘表名’,’rowkey’
deleteall 'orders','000001'

Hbase高手之路 -- 第四章 -- HBase Shell_第15张图片

说明:
HBase删除数据时,其实并不是真的删除,而是给数据做一个删除标志,再查询数据的时候不显示出来。

3) 清空表

语法:

truncate ‘表名’
truncate 'orders'

Hbase高手之路 -- 第四章 -- HBase Shell_第16张图片

五、 数据的导入

1. 数据文件的准备

模拟某系统产生日志数据文件,把这些数据文件导入到hbase中
Hbase高手之路 -- 第四章 -- HBase Shell_第17张图片

2. 上传数据文件到服务器

Hbase高手之路 -- 第四章 -- HBase Shell_第18张图片

3. 创建表

Hbase高手之路 -- 第四章 -- HBase Shell_第19张图片

4. 执行命令导入数据文件

在这里插入图片描述

5. 查看数据

在这里插入图片描述
Hbase高手之路 -- 第四章 -- HBase Shell_第20张图片

六、 计数操作

统计表中共有多少条记录

1. 计数命令

语法:

count ‘表名’

Hbase高手之路 -- 第四章 -- HBase Shell_第21张图片
注意:
当数据量很大的时候,这个操作比较耗时

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"

Hbase高手之路 -- 第四章 -- HBase Shell_第22张图片
Hbase高手之路 -- 第四章 -- HBase Shell_第23张图片
Hbase高手之路 -- 第四章 -- HBase Shell_第24张图片
Hbase高手之路 -- 第四章 -- HBase Shell_第25张图片
Hbase高手之路 -- 第四章 -- HBase Shell_第26张图片

七、 扫描操作

1. 全表扫描

语法:

scan ‘表名’,{FORMATTER=>’toString’}
scan "ORDER_INFO",{FORMATTER=>'toString'}

在这里插入图片描述

注意:
尽量避免全表扫描一张很大很大的表

2. 限定记录数

语法:

scan ‘表名’,{FORMATTER=>'toString',LIMIT=>数字}
scan "ORDER_INFO",{FORMATTER=>'toString',LIMIT=>2}

Hbase高手之路 -- 第四章 -- HBase Shell_第27张图片

3. 限定列

语法:

scan "ORDER_INFO",{FORMATTER=>'toString',COLUMNS=>[‘列簇名1:列名1’,’列簇名1:列名2’,……]}
scan "ORDER_INFO",{FORMATTER=>'toString',LIMIT=>2,COLUMNS=>['C1:PAYWAY','C1:STATUS']}

Hbase高手之路 -- 第四章 -- HBase Shell_第28张图片

4. 限定rowkey

Hbase高手之路 -- 第四章 -- HBase Shell_第29张图片
语法:

scan "ORDER_INFO",{ROWPREFIXFILTER=>’rowkey’}

scan "ORDER_INFO",{FORMATTER=>'toString',COLUMNS=>['C1:PAYWAY','C1:STATUS'],ROWPREFIXFILTER=>'0'}

Hbase高手之路 -- 第四章 -- HBase Shell_第30张图片

八、 过滤器(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内置的过滤器
Hbase高手之路 -- 第四章 -- HBase Shell_第31张图片
Hbase高手之路 -- 第四章 -- HBase Shell_第32张图片
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')"}

Hbase高手之路 -- 第四章 -- HBase Shell_第33张图片

1) 比较运算符

Hbase高手之路 -- 第四章 -- HBase Shell_第34张图片
在这里插入图片描述

2) 比较器

Hbase高手之路 -- 第四章 -- HBase Shell_第35张图片

3) 比较器表达式

基本语法:比较器类型:比较器的值
Hbase高手之路 -- 第四章 -- HBase Shell_第36张图片

4. 案例一:使用RowFilter查询指定订单id的数据

1) 需求:

查询指定订单的数据,订单号为“02602f66-adc7-40d4-8485-76b5632b5b53”、订单状态及支付方式

2) 分析

  1. 因为要订单ID就是ORDER_INFO表的rowkey,所以,我们应该使用rowkey过滤器来过滤
  2. 通过HBase的JAVA API,找到RowFilter构造器
    Hbase高手之路 -- 第四章 -- HBase Shell_第37张图片

通过上图,可以分析得到,RowFilter过滤器接受两个参数,

  • op——比较运算符
  • rowComparator——比较器
    所以构建该Filter的时候,只需要传入两个参数即可

3) 命令

scan 'ORDER_INFO',{FORMATTER=>'toString',FILTER=>"RowFilter(=,'binary:02602f66-adc7-40d4-8485-76b5632b5b53')",COLUMNS=>['C1:PAYWAY','C1:STATUS']}

Hbase高手之路 -- 第四章 -- HBase Shell_第38张图片

5. 案例二:查询状态为已付款的订单

1) 需求:

查询状态为已付款的订单

2) 分析

  1. 因为此处要指定列来进行查询,所以,我们不再使用rowkey过滤器,而是要使用列过滤器
  2. 我们要针对指定列和指定值进行过滤,比较适合使用SingleColumnValueFilter过滤器,查看JAVA API

Hbase高手之路 -- 第四章 -- HBase Shell_第39张图片
需要传入四个参数:

  • 列簇
  • 列标识(列名)
  • 比较运算符
  • 比较器

注意:

  • 列名STATUS的大小写一定要对!此处使用的是大写!
  • 列名写错了查不出来数据,但HBase不会报错,因为HBase是无模式的

3) 命令:

scan 'ORDER_INFO',{FORMATTER=>'toString',FILTER=>"SingleColumnValueFilter('C1','STATUS',=,'binary:已付款')"}

Hbase高手之路 -- 第四章 -- HBase Shell_第40张图片

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'}

Hbase高手之路 -- 第四章 -- HBase Shell_第41张图片

九、 INCR

1. 需求

某新闻APP应用为了统计每个新闻的每隔一段时间的访问次数,他们将这些数据保存在HBase中。
该表格数据如下所示:
在这里插入图片描述

要求:原子性增加新闻的访问次数值。

2. incr操作简介

incr可以实现对某个单元格的值进行原子性计数。语法如下:
incr ‘表名’,‘rowkey’,‘列蔟:列名’,累加值(默认累加1)

  • 如果某一列要实现计数功能,必须要使用incr来创建对应的列
  • 使用put创建的列是不能实现累加的

3. 导入测试数据

Hbase高手之路 -- 第四章 -- HBase Shell_第42张图片

该脚本创建了一个表,名为NEWS_VISIT_CNT,列蔟为C1。并使用incr创建了若干个计数器,每个rowkey为:新闻的编号_时间段。CNT为count的缩写,表示访问的次数。

导入hbase

在这里插入图片描述
显示前五条数据

Hbase高手之路 -- 第四章 -- HBase Shell_第43张图片

4. 获取计数器的值命令

语法:

get_counter,’表名’,’rowkey’,’列簇:列名’
get_counter "NEWS_VISIT_CNT",'0000000001_00:00-01:00','C1:CNT'

Hbase高手之路 -- 第四章 -- HBase Shell_第44张图片

5. 使用incr进行累加操作

incr 'NEWS_VISIT_CNT','0000000001_00:00-01:00','C1:CNT'

Hbase高手之路 -- 第四章 -- HBase Shell_第45张图片
在这里插入图片描述

十、 shell管理操作

1. status

显示服务器的状态
Hbase高手之路 -- 第四章 -- HBase Shell_第46张图片

2. whoami

显示当前用户
Hbase高手之路 -- 第四章 -- HBase Shell_第47张图片

3. list

显示当前所有的表

Hbase高手之路 -- 第四章 -- HBase Shell_第48张图片

4. count

统计指定表的记录数

Hbase高手之路 -- 第四章 -- HBase Shell_第49张图片

5. describe

显示表的结构信息
Hbase高手之路 -- 第四章 -- HBase Shell_第50张图片

6. exists

判断某个表是否存,适用于表很多的时候

Hbase高手之路 -- 第四章 -- HBase Shell_第51张图片

7. is_enabled、is_disabled

判断表是否启用或禁用
Hbase高手之路 -- 第四章 -- HBase Shell_第52张图片

8. alter

改变表和列簇的模式

Hbase高手之路 -- 第四章 -- HBase Shell_第53张图片
Hbase高手之路 -- 第四章 -- HBase Shell_第54张图片

9. disable和enable

禁用和启动表

10. drop

删除一张表,记得在删除表之前必须先禁用

11. truncate

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

你可能感兴趣的:(hbase,hadoop,hbase,big,data,大数据)