HBase高手之路4-Shell操作


image-20230220084553544

HBase高手之路3—HBase的shell操作

一、hbase的shell命令汇总

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

二、需求

有以下的订单数据,需要将其保存在HBase中

订单id订单状态支付金额支付方式用户id操作时间商品分类
001已付款189.511000012023-3-6 9:10:24手机

三、表的操作

1.进入shell命令行

注意:需要提前启动 ZooKeeper、hdfs、hbase集群

image-20230308223358923

2.创建表

命令格式:

create '表名','列簇名1'[,'列簇名2',...]

image-20230308223646357

注意:create要小写,一个表可以有多个列簇

3.查看表的定义

命令格式:

describe '表名'

image-20230308223933406

4.列出所有的表

命令格式:

list

5.删除表

1)禁用表

命令格式:

disable '表名'

image-20230308224302201

2)启用表

命令格式:

enable '表名'

image-20230308224446904

3)删除表

命令格式:

drop '表名'

image-20230308224735495

注意:表处于启用状态时是无法删除的,若要删除表需要先禁用表,在进行删除。

四、数据的操作

1.添加数据

命令格式:

put '表名','rowkey行键','列簇名:列名',

image-20230308225608868

依次添加其他的数据

image-20230308225753624

注意:如果显示中文乱码,是因为hbase的shell中显示的是中文的十六进制编码,要解决中文乱码,需要添加选项,jrubby语法格式:

{属性名=>属性值}

如果有多个属性,中间用逗号格式

image-20230308225948457

image-20230308230110211

image-20230308230424118

image-20230308230707310

再次添加另一个rowkey的数据

image-20230308231006936

image-20230308231411706

2.获取(查看)数据

1)获取一行数据

命令格式:

get '表名','rowkey'

image-20230308231611538

image-20230308231709673

2)获取单个数据

命令格式:

get '表名','rowkey','列簇名:列名'

image-20230308232121937

3.更新(修改)数据

命令格式:

put '表名','rowkey行键','列簇名:列名',新值

在这里插入图片描述

说明:

  • put命令如果键值存在则修改,如果不存在则添加
  • 在HBase中会自动维护表中数据的版本,即时间戳
  • 每执行一次put操作,都会生产一个新的时间戳

4.删除数据

1)删除指定列的数据

命令格式:

delete '表名','行键','列簇名:列名'

image-20230309000017422

2)删除整行数据

image-20230309000134939

命令格式:

deleteall '表名','行键'

image-20230309000258041

3)清空表

命令格式:

truncate '表名'

image-20230309000521697

五、导入数据

1.数据文件的准备

image-20230315122148022

2.把数据文件上次到服务器

image-20230315122451670

3.创建表,根据数据文件的定义

注意:集群启动

  1. 启动ZooKeeper
  2. 启动hdfs
  3. 启动HBASE
  4. 进入shell命令行
create 'ORDER_INFO' ,'C1'

image-20230315123914770

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

image-20230315124035164

5.查看数据

在这里插入图片描述

此时,HBase的数据在HDFS上是的存储查看

image-20230315124432172

六、计数操作

统计表中有多少条数据

1.计数命令

语法:

count '表名'

功能:统计rowkey不同的行数

image-20230315124714994

注意:当数据量很大的时候,这个操作是比较耗时的

2.MR程序计数

当数据量很大很大的时候,可以通过HBase提供的MR程序进行计数,这个mr程序是

org.apache.hadoop.hbase.mapreduce.RowCounter,语法格式:

hbase org.apache.hadoop.hbase.mapreduce.RowCounter '表名'

此时需启动yarn

image-20230315125009979

image-20230315125047846

启动计数命令

hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'ORDER_INFO'

image-20230315125250306

image-20230315125312801

image-20230315125335912

七、扫描操作

1.全表扫描

语法:
scan ‘表名’,{FORMATTER=>‘toString’}

image-20230315125606533

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

2.限定记录数

语法:

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

image-20230315125947678

3.限定列

Rubby语法:

scan ‘表名’,{FORMATTER=>'toString',COLUMNS=>[‘列簇名1:列名1,’列簇名1:列名2,...]}
scan "ORDER_INFO",{FORMATTER=>'toString',LIMIT=>3,COLUMNS=>['C1:CATEGORY','C1:PAY_MONEY']}

image-20230315130445624

4.限定rowkey

语法:

scan ‘表名’,{FORMATTER=>'toString',ROWPREFIXFILTER=>’rowkey一部分’}
scan "ORDER_INFO",{FORMATTER=>'toString',COLUMNS=>['C1:CATEGORY','C1:PAY_MONEY'],ROWPREFIXFILTER=>'e'}

image-20230315130743173

image-20230315130853326

八、HBase的过滤器

1.简介

在HBase中,如果要对海量的数据进行扫描查询,尤其是全表扫描效率很低,可以使用过滤器Filter来提高查询的效率。过滤器Filter可以根据主键、列簇、列、版本号(时间戳)等条件对数据进行查询过滤。

在HBase中,使用过滤器有两种方式,一种就是使用命令行基于jRubby语法的选项实现交互式查询,另一种是基于HBase的JAVA API的方式进行编程开发。

官网文档:https://hbase.apache.org/devapidocs/index.html

2.过滤器

可以通过show_filters命令,查看hbase内置的过滤器

image-20230315140420882

我们来解释一下这些过滤器的用法:

类型过滤器功能
rowkey过滤器RowFilter实现行键字符串的比较和过滤
PrefixFilterrowkey的前缀过滤器
KeyOnlyFilter只对单元格的键过滤不显示值
FirstKeyOnlyFilter只扫描显示相同键的第一个单元格,其对应的键值会显示出来
列过滤器FamilyFilter列簇过滤器
QualifierFilter列限定符过滤器,只显示对应列簇列名的数据
ColumnPrefixFilter对列名的前缀进行限定
MultipleColumnPrefixFilter对多个列名的前缀进行限定
ColumnRangeFilter列名称范围的过滤器
值过滤器ValueFilter值过滤器,查询符合条件的键值对
SingleColumnValueFilter对单个值进行过滤
ColumnValueFilter列值的过滤器
SingleColumnValueExcludeFilter排除匹配成功的值
其他过滤器ColumnPaginationFilter列分页过滤器,返回offset、limit的列
PageFilter分页过滤器,分页显示
TimestampsFilter时间戳过滤器
ColumnCountGetFilter限制每个逻辑行返回值对的个数
DependentColumnFilter依赖列过滤器

3.过滤器的用法

过滤器一般结合scan来使用

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

image-20230315141149174

一般语法:

scan ‘表名’,{FILTER=>”过滤器的名称(参数列表(如比较运算符,比较器))}
1)比较运算符

比较运算符是我们比较常见的。

运算符功能
=等于
>大于
<小于
>=大于等于
<=小于等于
!=不等于
2)比较器
比较器功能
BinaryComparator匹配完整的字节数组
BinaryPrefixComparator匹配字节数组的前缀
BitComparator匹配比特位
NullComparator匹配空值
RegexStringComparator匹配正则表达式
SubstringComparator匹配子字符串
3)比较器表达式
比较器表达式缩写
BinaryComparatorbinary:值
BinaryPrefixComparatorbinaryprefix:值
BitComparatorbit:值
NullComparatornull
RegexStringComparatorregexstring:正则表达式
SubstringComparatorsubstring:值

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

1)需求

查询指定订单的数据,订单号为“e8b3bb37-1019-4492-93c7-305177271a71”,订单状态及支付方式

2)分析
  • 因为订单id就说表的rowkey,所以应该使用rowkey过滤器RowFilter

image-20230315142049236

只需要两个参数

  • 比较运算符:=
  • 比较器表达式:binary:订单号
3)实现
scan 'ORDER_INFO',{FORMATTER=>'toString',COLUMNS=>['C1:STATUS','C1:PAYWAY'],FILTER=>"RowFilter(=,'binary:e8b3bb37-1019-4492-93c7-305177271a71')"}

image-20230315142259349

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

1)需求

查询状态为已付款的订单

2)分析
  • 因为查询状态为已付款要查询指定值,所以应该使用值过滤器SingleColumnValueFilter

image-20230315142514218

需要传入四个参数

  • 列簇
  • 列名
  • 比较运算符
  • 比较器表达式
scan 'ORDER_INFO',{FORMATTER=>'toString',FILTER=>"SingleColumnValueFilter('c1','STATUS',=,'binary:已付款')"}

image-20230315142911806

注意:

  • 列簇名和列名大小写一定要写对
  • 如果列簇名和列名大小写写错并不能过滤数据,但是HBase不会报错,而是显示全部的数据,因为HBase是无模式的

6.案例三:组合多条件过滤1

1)需求

查询支付方式为1,且支付金额大于8000的订单

2)分析
  • 此处需要使用多个过滤器共同来实现查询,多个过滤器,可以使用AND(并且)或者OR(或者)来组合多个过滤器完成查询
  • 使用SingleColumnValueFilter实现对应列的查询
  1. 支付方式为1的过滤器
SingleColumnValueFilter('C1', 'PAYWAY', = , 'binary:1')
  1. 支付金额大于8000的过滤器
SingleColumnValueFilter('C1', 'PAY_MONEY', > , 'binary:8000')
  1. 完整的命令
scan 'ORDER_INFO', {FORMATTER => 'toString',FILTER => "SingleColumnValueFilter('C1', 'PAYWAY', = , 'binary:1') AND SingleColumnValueFilter('C1', 'PAY_MONEY', > , 'binary:8000')"}

image-20230320112103038

注意:

  • HBase shell中比较默认都是字符串比较,所以如果是比较数值类型的,会出现不准确的情况
  • 例如:在字符串比较中4000是比100000大的
  • 外层必须使用双引号,内层使用单引号

我们还可以加上限定列:

scan 'ORDER_INFO', {FORMATTER => 'toString',FILTER => "SingleColumnValueFilter('C1', 'PAYWAY', = , 'binary:1') AND SingleColumnValueFilter('C1', 'PAY_MONEY', > , 'binary:8000')",COLUMNS=>['C1:PAYWAY','C1:PAY_MONEY']}

image-20230320112316410

7. 案例四:组合多条件过滤2

1)需求

查询类别为“维修;手机;”或者“数码;女装;”,并且状态为“已付款”的订单,只显示类别和状态

2)分析
  • 此处需要使用多个过滤器组合使用,多个过滤器可以使用AND(并且)、OR(或者)来进行组合
  • 使用值过滤器中的SingleColumnValueFilter实现对应列值的查询

完整的命令

scan 'ORDER_INFO', {FORMATTER => 'toString',FILTER => "(SingleColumnValueFilter('C1', 'CATEGORY', = , 'binary:维修;手机;') OR SingleColumnValueFilter('C1', 'CATEGORY', = , 'binary:数码;女装;')) AND SingleColumnValueFilter('C1', 'STATUS', =, 'binary:已付款')",COLUMNS=>['C1:CATEGORY','C1:STATUS']}

image-20230320112444753

8.作业

选择操作时间在2020-04-25,12点8分到9分之间的已完成的订单,只显示操作时间和状态

scan 'ORDER_INFO', {FORMATTER => 'toString',FILTER => "SingleColumnValueFilter('C1', 'OPERATION_DATE', > , 'binary:2020-04-25 12:08:00') AND SingleColumnValueFilter('C1', 'OPERATION_DATE', = , 'binary:2020-04-25 12:09:00')",COLUMNS=>['C1:OPERATION_DATE','C1:STATUS']}

image-20230320100200686

九、INCR

incr(increament)命令可以实现某个单元格的值进行原子性计数累加,默认累加1

1. 需求

某新闻app应用为了统计每个新闻的每隔一段时间的访问次数,将新闻数据保存在HBase中,该表格的数据如下所示,要求原子性的增加新闻的访问次数

新闻ID访问次数时间段rowkey
00000000011200:00-01:000000000001_00:00-01:00
00000000022001:00-02:000000000002_01:00-02:00

2. incr操作

语法:

incr ‘表名’,‘rowkey’,‘列簇名:列名’,[累加值]

说明:

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

3.基本使用

image-20230320123358809

image-20230320123658394

image-20230320123822800

4.导入准备好的数据

image-20230320123846222

上传服务器

image-20230320123938823

导入HBase

image-20230320124048247

显示前5条数据

image-20230320124253280

5.获取计数器值的命令

不能使用get来获取计数器的值

image-20230320124502710

语法:

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

image-20230320124948914

image-20230320125058118

6.使用incr进行累加操作,修改计数器的值

image-20230320125410075

image-20230320125514176

十、Shell管理操作

1.status

查看服务器的状态

image-20230320125718373

2.whoami

显示当前用户

image-20230320125748533

3.list

显示当前的所有的表

image-20230320125820563

4.count

统计表的记录数

image-20230320125901029

5.describe

显示表的结构信息

image-20230320125940601

6.exists

判断某个表是否存在

image-20230320130103974

7.is_enabled、is_disabled

判断某个表是否被启用或者禁用

image-20230320130314663

8.alter

改变表和列簇的模式

  • 新增列簇

image-20230320130557415

  • 删除列簇

image-20230320130704439

image-20230320130926617

参考文章

HBASE官网文档

  • 6
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

W_chuanqi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值