HBase高级操作

简介: HBase高级操作

1 需求

在资料的 数据集ORDER_INFO.txt 中,有一份这样的HBase数据集,我们需要将这些指令放到HBase中执行,将数据导入到HBase中。

可以看到这些都是一堆的put语句。那么如何才能将这些语句全部执行呢?

put 'ORDER_INFO' ,'02602f66-adc7-40d4-8485-76b5632b5b53', 'C1:STATUS','已提交'
put 'ORDER_INFO' ,'0968a418-f2bc-49b4-b9a9-2157cf214cfd', 'C1:STATUS','已完成'
put 'ORDER_INFO' ,'0e01edba-5e55-425e-837a-7efb91c56630', 'C1:STATUS','已提交'
put 'ORDER_INFO' ,'0e01edba-5e55-425e-837a-7efb91c56630', 'C1:STATUS','已付款'
put 'ORDER_INFO' ,'0f46d542-34cb-4ef4-b7fe-6dcfa5f14751', 'C1:STATUS','已提交'
put 'ORDER_INFO' ,'0f46d542-34cb-4ef4-b7fe-6dcfa5f14751', 'C1:STATUS','已付款'
put 'ORDER_INFO' ,'1fb7c50f-9e26-4aa8-a140-a03d0de78729', 'C1:STATUS','已完成'
put 'ORDER_INFO' ,'23275016-996b-420c-8edc-3e3b41de1aee', 'C1:STATUS','已付款'
put 'ORDER_INFO' ,'2375a7cf-c206-4ac0-8de4-863e7ffae27b', 'C1:STATUS','已完成'
put 'ORDER_INFO' ,'2375a7cf-c206-4ac0-8de4-863e7ffae27b', 'C1:STATUS','已付款'
put 'ORDER_INFO' ,'269fe10c-740b-4fdb-ad25-7939094073de', 'C1:STATUS','已提交'
put 'ORDER_INFO' ,'269fe10c-740b-4fdb-ad25-7939094073de', 'C1:STATUS','已付款'
put 'ORDER_INFO' ,'2849fa34-6513-44d6-8f66-97bccb3a31a1', 'C1:STATUS','已提交'
put 'ORDER_INFO' ,'28b7e793-6d14-455b-91b3-0bd8b23b610c', 'C1:STATUS','已提交'
put 'ORDER_INFO' ,'28b7e793-6d14-455b-91b3-0bd8b23b610c', 'C1:STATUS','已付款'
put 'ORDER_INFO' ,'2909b28a-5085-4f1d-b01e-a34fbaf6ce37', 'C1:STATUS','已提交'
put 'ORDER_INFO' ,'2a01dfe5-f5dc-4140-b31b-a6ee27a6e51e', 'C1:STATUS','已提交'
put 'ORDER_INFO' ,'2a01dfe5-f5dc-4140-b31b-a6ee27a6e51e', 'C1:STATUS','已付款'
put 'ORDER_INFO' ,'2b86ab90-3180-4940-b624-c936a1e7568d', 'C1:STATUS','已付款'
put 'ORDER_INFO' ,'2b86ab90-3180-4940-b624-c936a1e7568d', 'C1:STATUS','已提交'
put 'ORDER_INFO' ,'2b86ab90-3180-4940-b624-c936a1e7568d', 'C1:STATUS','已取消'
put 'ORDER_INFO' ,'2e19fbe8-7970-4d62-8e8f-d364afc2dd41', 'C1:STATUS','已付款'
put 'ORDER_INFO' ,'2fc28d36-dca0-49e8-bad0-42d0602bdb40', 'C1:STATUS','已付款'
put 'ORDER_INFO' ,'31477850-8b15-4f1b-9ec3-939f7dc47241', 'C1:STATUS','已提交'
put 'ORDER_INFO' ,'31477850-8b15-4f1b-9ec3-939f7dc47241', 'C1:STATUS','已付款'
put 'ORDER_INFO' ,'39319322-2d80-41e7-a862-8b8858e63316', 'C1:STATUS','已提交'
put 'ORDER_INFO' ,'39319322-2d80-41e7-a862-8b8858e63316', 'C1:STATUS','已完成'
put 'ORDER_INFO' ,'3d2254bd-c25a-404f-8e42-2faa4929a629', 'C1:STATUS','已提交'

2 执行command文件

2.1 上传command文件

将该数据集文件上传到指定的目录中

2.2 执行

使用以下命令执行:

hbase shell /export/software/ORDER_INFO.txt即可。

3 计数操作

3.1 需求

查看HBase中的ORDER_INFO表,一共有多少条记录。

3.2 count命令

count命令专门用来统计一个表中有多少条数据。语法:

count ‘表名’

注意:这个操作是比较耗时的。在数据量大的这个命令可能会运行很久。

3.3 获取订单数据

count 'ORDER_INFO'

4 大量数据的计数统计

当HBase中数据量大时,可以使用HBase中提供的MapReduce程序来进行计数统计。语法如下:

$HBASE_HOME/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter '表名'

4.1 启动YARN集群

启动yarn集群

start-yarn.sh

启动history server

mr-jobhistory-daemon.sh start historyserver

4.2 执行MR JOB

$HBASE_HOME/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter ‘ORDER_INFO’

通过观察YARN的WEB UI,我们发现HBase启动了一个名字为rowcounter_ORDER_INFO的作业。

5 扫描操作

5.1 需求一:查询订单所有数据

5.1.1 需求

查看ORDER_INFO表中所有的数据

5.1.2 scan命令

在HBase,我们可以使用scan命令来扫描HBase中的表。语法:

scan ‘表名’

5.1.3 扫描ORDER_INFO表

scan ‘ORDER_INFO’,{FORMATTER => ‘toString’}

注意:要避免scan一张大表!

5.2 需求二:查询订单数据(只显示3条)

scan ‘ORDER_INFO’, {LIMIT => 3, FORMATTER => ‘toString’}

5.3 需求三:查询订单状态、支付方式

5.3.1 需求

只查询订单状态以及支付方式,并且只展示3条数据

5.3.2 命令

scan ‘ORDER_INFO’, {LIMIT => 3, COLUMNS => [‘C1:STATUS’, ‘C1:PAYWAY’], FORMATTER =>

‘toString’}

注意:

⚫ [‘C1:STATUS’, …]在Ruby中[]表示一个数组

5.4 需求四:查询指定订单ID的数据并以中文展示

根据ROWKEY来查询对应的数据,ROWKEY为 02602f66-adc7-40d4-8485-76b5632b5b53 ,只查询订单状态、支付方式,并以中文展示。要查询指定ROWKEY的数据,需要使用 ROWPREFIXFILTER,用法为:

scan '表名', {ROWPREFIXFILTER => 'rowkey'}

实现指令:

scan 'ORDER_INFO', {ROWPREFIXFILTER => '02602f66-adc7-40d4-8485-76b5632b5b53', COLUMNS =>['C1:STATUS', 'C1:PAYWAY'], FORMATTER => 'toString'}

6 过滤器

6.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


6.2 HBase中的过滤器

在HBase的shell中,通过show_filters指令,可以查看到HBase中内置的一些过滤器。

hbase(main):028:0> show_filters
DependentColumnFilter
KeyOnlyFilter
ColumnCountGetFilter
SingleColumnValueFilter
PrefixFilter
SingleColumnValueExcludeFilter
FirstKeyOnlyFilter
ColumnRangeFilter
ColumnValueFilter
TimestampsFilter
FamilyFilter
QualifierFilter
ColumnPrefixFilter
RowFilter
MultipleColumnPrefixFilter
InclusiveStopFilter
PageFilter
ValueFilter
ColumnPaginationFilter

ce53dedd81fa43b7bd229dd54971b847.png

Java API官方地址:https://hbase.apache.org/devapidocs/index.html

6.3 过滤器的用法

过滤器一般结合scan命令来使用。打开HBase的JAVA API文档。找到RowFilter的构造器说明,我们

来看以下,HBase的过滤器该如何使用。

scan ‘表名’, { Filter => "过滤器(比较运算符, ‘比较器表达式’)” }

6.3.1 比较运算符

6.3.2 比较器

6.3.3 比较器表达式

基本语法:比较器类型:比较器的值

6.4 需求一:使用RowFilter查询指定订单ID的数据

6.4.1 需求

只查询订单的ID为:02602f66-adc7-40d4-8485-76b5632b5b53、订单状态以及支付方式

分析


因为要订单ID就是ORDER_INFO表的rowkey,所以,我们应该使用rowkey过滤器来过滤

通过HBase的JAVA API,找到RowFilter构造器

0630487c72d647dd9a7eae5ff2a15494.png

  1. 通过上图,可以分析得到,RowFilter过滤器接受两个参数,
    ⚫ op——比较运算符
    ⚫ rowComparator——比较器
    所以构建该Filter的时候,只需要传入两个参数即可

6.4.2 命令

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

6.5 需求二:查询状态为已付款的订单

6.5.1 需求

查询状态为「已付款」的订单

分析

  1. 因为此处要指定列来进行查询,所以,我们不再使用rowkey过滤器,而是要使用列过滤器
  2. 我们要针对指定列和指定值进行过滤,比较适合使用SingleColumnValueFilter过滤器,查看JAVA
    API
  1. 需要传入四个参数:
    ⚫ 列簇
    ⚫ 列标识(列名)
    ⚫ 比较运算符
    ⚫ 比较器
    注意:
    ⚫ 列名STATUS的大小写一定要对!此处使用的是大写!
    ⚫ 列名写错了查不出来数据,但HBase不会报错,因为HBase是无模式的

6.5.2 命令

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


6.6 需求三:查询支付方式为1,且金额大于3000的订单

分析

⚫ 此处需要使用多个过滤器共同来实现查询,多个过滤器,可以使用AND或者OR来组合多个过

滤器完成查询

⚫ 使用SingleColumnValueFilter实现对应列的查询


6.6.1 命令

查询支付方式为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'}

注意:

⚫ HBase shell中比较默认都是字符串比较,所以如果是比较数值类型的,会出现不准确的情况

⚫ 例如:在字符串比较中4000是比100000大的

7 INCR

7.1 需求

某新闻APP应用为了统计每个新闻的每隔一段时间的访问次数,他们将这些数据保存在HBase中。

该表格数据如下所示:

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

7.2 incr操作简介

incr可以实现对某个单元格的值进行原子性计数。语法如下:

incr ‘表名’,‘rowkey’,‘列蔟:列名’,累加值(默认累加1)

⚫ 如果某一列要实现计数功能,必须要使用incr来创建对应的列

⚫ 使用put创建的列是不能实现累加的

7.3 导入测试数据

# 创建表
create 'NEWS_VISIT_CNT', 'C1';
incr 'NEWS_VISIT_CNT','0000000001_00:00-01:00','C1:CNT',12
incr 'NEWS_VISIT_CNT','0000000002_01:00-02:00','C1:CNT',12
incr 'NEWS_VISIT_CNT','0000000003_02:00-03:00','C1:CNT',123
incr 'NEWS_VISIT_CNT','0000000004_00:00-01:00','C1:CNT',4
incr 'NEWS_VISIT_CNT','0000000005_01:00-02:00','C1:CNT',4
incr 'NEWS_VISIT_CNT','0000000006_02:00-03:00','C1:CNT',3
incr 'NEWS_VISIT_CNT','0000000007_01:00-02:00','C1:CNT',1
incr 'NEWS_VISIT_CNT','0000000008_02:00-03:00','C1:CNT',123
incr 'NEWS_VISIT_CNT','0000000009_00:00-01:00','C1:CNT',5
incr 'NEWS_VISIT_CNT','0000000010_01:00-02:00','C1:CNT',5
incr 'NEWS_VISIT_CNT','0000000011_00:00-01:00','C1:CNT',123
incr 'NEWS_VISIT_CNT','0000000012_01:00-02:00','C1:CNT',1
incr 'NEWS_VISIT_CNT','0000000013_02:00-03:00','C1:CNT',23
incr 'NEWS_VISIT_CNT','0000000014_01:00-02:00','C1:CNT',123
incr 'NEWS_VISIT_CNT','0000000015_02:00-03:00','C1:CNT',83
incr 'NEWS_VISIT_CNT','0000000016_00:00-01:00','C1:CNT',1
incr 'NEWS_VISIT_CNT','0000000017_01:00-02:00','C1:CNT',5
incr 'NEWS_VISIT_CNT','0000000018_01:00-02:00','C1:CNT',9
incr 'NEWS_VISIT_CNT','0000000019_02:00-03:00','C1:CNT',9
incr 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:CNT',6
incr 'NEWS_VISIT_CNT','0000000021_02:00-03:00','C1:CNT',5
incr 'NEWS_VISIT_CNT','0000000022_00:00-01:00','C1:CNT',7
incr 'NEWS_VISIT_CNT','0000000023_01:00-02:00','C1:CNT',98
incr 'NEWS_VISIT_CNT','0000000024_00:00-01:00','C1:CNT',7
incr 'NEWS_VISIT_CNT','0000000025_01:00-02:00','C1:CNT',0
incr 'NEWS_VISIT_CNT','0000000026_02:00-03:00','C1:CNT',0
incr 'NEWS_VISIT_CNT','0000000027_01:00-02:00','C1:CNT',9
incr 'NEWS_VISIT_CNT','0000000028_02:00-03:00','C1:CNT',8
incr 'NEWS_VISIT_CNT','0000000029_01:00-02:00','C1:CNT',9
incr 'NEWS_VISIT_CNT','0000000030_02:00-03:00','C1:CNT',3
incr 'NEWS_VISIT_CNT','0000000031_00:00-01:00','C1:CNT',5
incr 'NEWS_VISIT_CNT','0000000032_01:00-02:00','C1:CNT',4
incr 'NEWS_VISIT_CNT','0000000033_02:00-03:00','C1:CNT',6
incr 'NEWS_VISIT_CNT','0000000034_01:00-02:00','C1:CNT',5
incr 'NEWS_VISIT_CNT','0000000035_02:00-03:00','C1:CNT',7

该脚本创建了一个表,名为NEWS_VISIT_CNT,列蔟为C1。并使用incr创建了若干个计数器,每个

rowkey为:新闻的编号_时间段。CNT为count的缩写,表示访问的次数。

hbase shell /export/software/NEWS_VISIT_CNT.txt scan 'NEWS_VISIT_CNT', {LIMIT => 5, FORMATTER => 'toString'}


7.4 需求一:对0000000020新闻01:00 - 02:00访问计数+1

1.获取0000000020这条新闻在01:00-02:00当前的访问次数

get_counter 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:CNT'

此处,如果用get获取到的数据是这样的:


base(main):029:0> get 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:CNT'
COLUMN CELL
C1:CNT timestamp=1599529533072,
value=\x00\x00\x00\x00\x00\x00\x00\x06
1 row(s)
Took 0.0243 seconds

2.使用incr进行累加

incr ‘NEWS_VISIT_CNT’,‘0000000020_01:00-02:00’,‘C1:CNT’

3.再次查案新闻当前的访问次数

get_counter ‘NEWS_VISIT_CNT’,‘0000000020_01:00-02:00’,‘C1:CNT’


8 更多的操作

以下连接可以查看到所有HBase中支持的SHELL脚本。

https://learnhbase.net/2013/03/02/hbase-shell-commands/


相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
  相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情: https://cn.aliyun.com/product/hbase   ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
7月前
|
分布式计算 资源调度 Hadoop
HBase表数据的读、写操作与综合操作
HBase表数据的读、写操作与综合操作
100 0
|
7月前
|
Java Shell 分布式数据库
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
164 0
|
Shell 分布式数据库 Apache
Hbase常用shell操作
Hbase常用shell操作
440 1
|
7月前
|
分布式计算 Hadoop Shell
熟悉常用的HBase操作
熟悉常用的HBase操作
173 3
熟悉常用的HBase操作
|
7月前
|
分布式计算 Hadoop Shell
|
5月前
|
DataWorks 数据管理 大数据
DataWorks操作报错合集之在连接HBase时出现超时问题,该怎么解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
6月前
|
Java 大数据 API
【大数据】HDFS、HBase操作教程(含指令和JAVA API)
【大数据】HDFS、HBase操作教程(含指令和JAVA API)
158 0
【大数据】HDFS、HBase操作教程(含指令和JAVA API)
|
7月前
|
消息中间件 关系型数据库 MySQL
实时计算 Flink版操作报错合集之使用 Event Time Temporal Join 关联多个 HBase 后,Kafka 数据的某个字段变为 null 是什么原因导致的
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
153 0
|
7月前
|
SQL 消息中间件 Kafka
实时计算 Flink版操作报错合集之使用 Event Time Temporal Join 关联多个 HBase 后,Kafka 数据的某个字段变为 null 是什么原因导致的
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
105 0
|
7月前
|
存储 分布式计算 分布式数据库
对给定的数据利用MapReduce编程实现数据的清洗和预处理,编程实现数据存储到HBase数据库,实现数据的增删改查操作接口
对给定的数据利用MapReduce编程实现数据的清洗和预处理,编程实现数据存储到HBase数据库,实现数据的增删改查操作接口
67 0