前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hbase入门篇02---数据模型和HBase Shell的基本使用

Hbase入门篇02---数据模型和HBase Shell的基本使用

作者头像
大忽悠爱学习
发布2023-05-23 10:09:15
9000
发布2023-05-23 10:09:15
举报
文章被收录于专栏:c++与qt学习

Hbase入门篇02---数据模型和基本使用

HBase数据模型

在HBASE中,数据存储在具有行和列的表中。这是看起来关系数据库(RDBMS)一样,但将HBASE表看成是多个维度的Map结构更容易理解。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • HBase中数据都是以表形式来组织的
  • HBase中的表由多个行组成

在HBase WebUI(http://node3:16010中可以查看到目前HBase中的表)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • HBASE中的行由一个rowkey(行键)和一个或多个列组成,列的值与rowkey、列相关联
  • 行在存储时按行键按字典顺序排序
  • 行键的设计非常重要,尽量让相关的行存储在一起

例如:存储网站域。如行键是域,则应该将域名反转后存储(org.apache.www、org.apache.mail、org.apache.jira)。这样,所有Apache域都在表中存储在一起,而不是根据子域的第一个字母展开。

在这里插入图片描述
在这里插入图片描述

  • HBASE中的列由列蔟(Column Family)和列限定符(Column Qualifier)组成
  • 表示如下:
    • 列蔟名:列限定符名。
      • 例如:C1:USER_ID、C1:SEX
在这里插入图片描述
在这里插入图片描述

列蔟(Column Family):

在这里插入图片描述
在这里插入图片描述
  • 出于性能原因,列蔟将一组列及其值组织在一起
  • 每个列蔟都有一组存储属性,例如:
    • 是否应该缓存在内存中
    • 数据如何被压缩或行键如何编码等
  • 表中的每一行都有相同的列蔟,但在列蔟中不存储任何内容
  • 所有的列蔟的数据全部都存储在一块(文件系统HDFS)
  • HBase官方建议所有的列蔟保持一样的列,并且将同一类的列放在一个列蔟中

列标识符(Column Qualifier):

  • 列蔟中包含一个个的列限定符,这样可以为存储的数据提供索引
  • 列蔟在创建表的时候是固定的,但列限定符是不作限制的
  • 不同的行可能会存在不同的列标识符

单元格 (cell)

  • 单元格是行、列系列和列限定符的组合
  • 包含一个值和一个时间戳(表示该值的版本)
  • 单元格中的内容是以二进制存储的
在这里插入图片描述
在这里插入图片描述

ROW

COLUMN+CELL

1250995

column=C1:ADDRESS, timestamp=1588591604729, value=\xC9\xBD\xCE\xF7\xCA

1250995

column=C1:LATEST_DATE, timestamp=1588591604729, value=2019-03-28

1250995

column=C1:NAME, timestamp=1588591604729, value=\xB7\xBD\xBA\xC6\xD0\xF9

1250995

column=C1:NUM_CURRENT, timestamp=1588591604729, value=398.5

1250995

column=C1:NUM_PREVIOUS, timestamp=1588591604729, value=379.5

1250995

column=C1:NUM_USEAGE, timestamp=1588591604729, value=19

1250995

column=C1:PAY_DATE, timestamp=1588591604729, value=2019-02-26

1250995

column=C1:RECORD_DATE, timestamp=1588591604729, value=2019-02-11

1250995

column=C1:SEX, timestamp=1588591604729, value=\xC5\xAE

1250995

column=C1:TOTAL_MONEY, timestamp=1588591604729, value=114


概念模型

Row Key

Time Stamp

ColumnFamily contents

ColumnFamily anchor

ColumnFamily people

“com.cnn.www”

t9

anchor:cnnsi.com = “CNN”

“com.cnn.www”

t8

anchor:my.look.ca = “CNN.com”

“com.cnn.www”

t6

contents:html = “…”

“com.cnn.www”

t5

contents:html = “…”

“com.cnn.www”

t3

contents:html = “…”

“com.example.www”

t5

contents:html = “…”

people:author = “John Doe”

  • 上述表格有两行、三个列蔟(contens、ancho、people)
  • “com.cnn.www”这一行anchor列蔟两个列(anchor:cssnsi.com、anchor:my.look.ca)、contents列蔟有个1个列(html)
  • “com.cnn.www”在HBase中有 t3、t5、t6、t8、t9 5个版本的数据
  • HBase中如果某一行的列被更新的,那么最新的数据会排在最前面,换句话说同一个rowkey的数据是按照倒序排序的

shell命令行进行CRUD操作

表的CRUD

我们可以以shell的方式来维护和管理HBase。例如:执行建表语句、执行增删改查操作等等。

HBase的shell其实是JRuby的IRB(交互式的Ruby),但在其中添加了一些HBase的命令。

  • 启动Hbase shell
代码语言:javascript
复制
hbase shell
  • 创建表
    • 语法: create '表名','列蔟名'...
代码语言:javascript
复制
# 创建订单表,表名为ORDER_INFO,该表有一个列蔟为C1
create 'ORDER_INFO','C1'

注意:

HBase是没有schema的,就是在创建表的时候无需指定表中有哪些列,只需要指定有多少个列族

在这里插入图片描述
在这里插入图片描述

  • 查看表
代码语言:javascript
复制
list
在这里插入图片描述
在这里插入图片描述
  • 删除表 (要删除某个表,必须要先禁用表)
    • 禁用表
      • 语法:disable “表名”
    • 删除表
      • 语法:drop “表名”
代码语言:javascript
复制
#删除ORDER_INFO表
disable "ORDER_INFO"
drop "ORDER_INFO"
在这里插入图片描述
在这里插入图片描述

详细解释:

  • disable "ORDER_INFO" 命令用于禁用指定表。当表被禁用后,该表上的所有操作都将无法执行,包括读取和写入数据。执行该命令后,可以使用is_disabled "ORDER_INFO" 命令来确认表是否已经禁用。禁用表的目的是为了在删除表之前先停止对该表的所有操作,以避免数据的丢失。
  • drop "ORDER_INFO" 命令用于彻底删除指定的表及其所有数据。执行该命令前,需要先使用disable "ORDER_INFO" 命令将该表禁用。执行该命令后,HBase将删除该表的所有数据和元数据,并将该表从集群中移除。需要注意的是,该命令执行后,将无法恢复已删除的数据,因此在执行该命令之前,请确保您已经备份了所有重要的数据。

数据的CRUD

  • PUT
    • HBase中的put命令,可以用来将数据保存到表中。但
    • put一次只能保存一个列的值。
    • 以下是put的语法结构:
      • put '表名','ROWKEY','列蔟名:列名','值'
在这里插入图片描述
在这里插入图片描述

也就是说一次只能put一个单元格的值

代码语言:javascript
复制
put 'ORDER_INFO','000001','C1:ID','000001'
put 'ORDER_INFO','000001','C1:STATUS','已提交'
put 'ORDER_INFO','000001','C1:PAY_MONEY',4070
put 'ORDER_INFO','000001','C1:PAYWAY',1
put 'ORDER_INFO','000001','C1:USER_ID',4944191
put 'ORDER_INFO','000001','C1:OPERATION_DATE','2020-04-25 12:09:16'
put 'ORDER_INFO','000001','C1:CATEGORY','手机;'
在这里插入图片描述
在这里插入图片描述
  • GET
    • 在HBase中,可以使用get命令来获取单独的一行数据。
    • 语法:
      • get '表名','rowkey'
代码语言:javascript
复制
get 'ORDER_INFO','000001'
在这里插入图片描述
在这里插入图片描述

  • 显示中文
    • 在HBase shell中,如果在数据中出现了一些中文,默认HBase shell中显示出来的是十六进制编码。
    • 要想将这些编码显示为中文,我们需要在get命令后添加一个属性:{FORMATTER => 'toString'}
代码语言:javascript
复制
get 'ORDER_INFO', '000001', {FORMATTER => 'toString'}
在这里插入图片描述
在这里插入图片描述

注:

  • { key => value},这个是Ruby语法,表示定义一个HASH结构
  • get是一个HBase Ruby方法,’ORDER_INFO’、’000001’、{FORMATTER => ‘toString’}是put方法的三个参数
  • FORMATTER要使用大写
  • 在Ruby中用{}表示一个字典,类似于hashtable,FORMATTER表示key、’toString’表示值

  • PUT
    • 同样,在HBase中,也是使用put命令来进行数据的更新,语法与之前的添加数据一模一样。
代码语言:javascript
复制
put 'ORDER_INFO', '000001', 'C1:STATUS', '已付款'

注意:

  • HBase中会自动维护数据的版本
  • 每当执行一次put后,都会重新生成新的时间戳
在这里插入图片描述
在这里插入图片描述

  • DELETE
    • 在HBase中,可以使用delete命令来将一个单元格的数据删除。
    • 语法格式如下:
      • delete '表名', 'rowkey', '列蔟:列'。
    • 注意:此处HBase默认会保存多个时间戳的版本数据,所以这里的delete删除的是最新版本的列数据。
  • 删除指定的列
代码语言:javascript
复制
delete 'ORDER_INFO','000001','C1:STATUS'
  • 删除整行数据
    • deleteall命令
      • deleteall命令可以将指定rowkey对应的所有列全部删除。
      • 语法:
        • deleteall '表名','rowkey'
代码语言:javascript
复制
deleteall 'ORDER_INFO','000001'

  • HBase删除一个列的数据,可能会存在一定的延时,因为一些系统的卡顿,执行写入,读取是非常快的
  • 删除数据的时候,其实HBase不是真正把数据删除掉,而是给某个列设置一个标记,然后查询数据的时候,有这个标志的数据,就不显示出来
  • 后台存在进程,专门来执行删除数据的操作
  • 执行delete的时候
    • 如果表中某个列经过了几次修改,那么会删除最近一次修改
    • 默认是保存三个最近修改的版本(version),版本使用时间戳表示

  • 清空表
    • truncate命令
      • truncate命令用来清空某个表中的所有数据。
      • 语法:
        • truncate "表名"
代码语言:javascript
复制
truncate 'ORDER_INFO'

数据批量导入

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

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

在这里插入图片描述
在这里插入图片描述
  • 将该数据集文件上传到指定的目录中
  • 使用以下命令执行:
代码语言:javascript
复制
hbase shell /export/software/ORDER_INFO.txt

计数操作

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

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

  • 语法:count ‘表名’

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

  • 获取订单数据
代码语言:javascript
复制
count 'ORDER_INFO'
在这里插入图片描述
在这里插入图片描述

大量数据的计数统计

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

  • 语法如下:
    • $HBASE_HOME/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter '表名'

具体步骤:

  • 启动YARN集群
代码语言:javascript
复制
启动yarn集群
start-yarn.sh
启动history server
mr-jobhistory-daemon.sh start historyserver
  • 执行MR JOB
代码语言:javascript
复制
$HBASE_HOME/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'ORDER_INFO'

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

在这里插入图片描述
在这里插入图片描述

扫描操作

  • scan命令
    • 在HBase,我们可以使用scan命令来扫描HBase中的表。
    • 语法:
      • scan '表名'
代码语言:javascript
复制
# {FORMATTER => 'toString'} 是一个可选参数,它指定了输出格式化器为 toString,该格式化器会将所有结果以字符串形式输出。
scan 'ORDER_INFO',{FORMATTER => 'toString'}
在这里插入图片描述
在这里插入图片描述

scan 命令用于扫描表,并将满足条件的行或列族返回。可以通过一些参数来指定扫描的范围、过滤条件、返回的列等。

例如:

  • scan 'ORDER_INFO':扫描 ORDER_INFO 表中的所有行。
  • scan 'ORDER_INFO', {STARTROW => '000001', ENDROW => '000010'}:扫描 ORDER_INFO 表中行键从 000001 到 0- 00010 的所有行。
  • scan 'ORDER_INFO', {COLUMNS => 'C1:col1'}:扫描 ORDER_INFO 表中 C1 列族下 col1 列的所有数据。
  • scan 'ORDER_INFO', {FILTER => "SingleColumnValueFilter('C1', 'col1', =, 'binary:1000')"}:扫描 ORDER_INFO 表中 C1 列族下 col1 列的值为 1000 的所有数据。

在上述命令中,可以通过设置 LIMIT 参数来限制返回的行数,也可以通过设置 TIMERANGE 参数来限制返回的时间范围,以实现更精细的扫描。

注意:要避免scan一张大表!原因如下:

  • 造成过多的磁盘 I/O:HBase 中的数据存储在 HDFS 中,使用 scan 命令扫描一张大表会涉及到大量的磁盘 I/O 操作,这可能会导致过多的磁盘负载,影响整个集群的性能。
  • 可能导致 RegionServer 宕机:当使用 scan 命令扫描一张大表时,HBase 会为该操作创建一个 Scanner,该 Scanner 会一直保持打开状态直到扫描结束。
  • 如果扫描的数据量非常大,Scanner 将会持续存在很长时间,占用大量的内存资源,这可能会导致 RegionServer 宕机或者内存溢出等问题。
  • 因此,为了避免这些问题,应该尽量避免使用 scan 命令扫描一张大表。
  • 如果必须要扫描大表,可以考虑使用一些技术手段来降低对磁盘和内存资源的压力,比如设置扫描范围、限制返回的列等,以及使用 MapReduce 等技术来实现分布式扫描。
  • 同时,还需要注意定期清理过期数据,以避免过多的数据积累导致扫描效率下降。

limit限制返回条数

  • 限制只返回三条数据
代码语言:javascript
复制
scan 'ORDER_INFO', {LIMIT => 3, FORMATTER => 'toString'}

返回指定列

  • 只查询订单状态以及支付方式,并且只展示3条数据
代码语言:javascript
复制
scan 'ORDER_INFO', {LIMIT => 3, COLUMNS => ['C1:STATUS', 'C1:PAYWAY'], FORMATTER => 'toString'}

注意:

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

返回指定行键对应的数据

  • 根据ROWKEY来查询对应的数据,ROWKEY为02602f66-adc7-40d4-8485-76b5632b5b53,只查询订单状态、支付方式,并以中文展示
  • 要查询指定ROWKEY的数据,需要使用ROWPREFIXFILTER,用法为:
代码语言:javascript
复制
scan '表名', {ROWPREFIXFILTER => 'rowkey'}
  • 实现指令:
代码语言:javascript
复制
scan 'ORDER_INFO', {ROWPREFIXFILTER => '02602f66-adc7-40d4-8485-76b5632b5b53', COLUMNS => ['C1:STATUS', 'C1:PAYWAY'], FORMATTER => 'toString'}

过滤器

在HBase中,如果要对海量的数据来进行查询,此时基本的操作是比较无力的。此时,需要借助HBase中的高级语法Filter来进行查询。

Filter可以根据列簇、列、版本等条件来对数据进行过滤查询。因为在HBase中,主键、列、版本都是有序存储的,所以借助Filter,可以高效地完成查询。

当执行Filter时,HBase会将Filter分发给各个HBase服务器节点来进行查询。

HBase中的过滤器也是基于Java开发的,只不过在Shell中,我们是使用基于JRuby的语法来实现的交互式查询。

以下是HBase 2.2的JAVA API文档:


HBase中的过滤器

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

代码语言:javascript
复制
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

rowkey 过滤器

RowFilter

实现行键字符串的比较和过滤

PrefixFilter

rowkey前缀过滤器

KeyOnlyFilter

只对单元格的键进行过滤和显示,不显示值

FirstKeyOnlyFilter

只扫描显示相同键的第一个单元格,其键值对会显示出来

InclusiveStopFilter

替代 ENDROW 返回终止条件行

列过滤器

FamilyFilter

列簇过滤器

QualifierFilter

列标识过滤器,只显示对应列名的数据

ColumnPrefixFilter

对列名称的前缀进行过滤

MultipleColumnPrefixFilter

可以指定多个前缀对列名称过滤

ColumnRangeFilter

过滤列名称的范围

值过滤器

ValueFilter

值过滤器,找到符合值条件的键值对

SingleColumnValueFilter

在指定的列蔟和列中进行比较的值过滤器

SingleColumnValueExcludeFilter

排除匹配成功的值

其他过滤器

ColumnPaginationFilter

对一行的所有列分页,只返回 [offset,offset+limit] 范围内的列

PageFilter

对显示结果按行进行分页显示

TimestampsFilter

时间戳过滤,支持等值,可以设置多个时间戳

ColumnCountGetFilter

限制每个逻辑行返回键值对的个数,在 get 方法中使用

DependentColumnFilter

允许用户指定一个参考列或引用列来过滤其他列的过滤器

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


过滤器的用法

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

代码语言:javascript
复制
scan '表名', { Filter => "过滤器(比较运算符, '比较器表达式')” }
  • 比较运算符

比较运算符

描述

=

等于

>

大于

>=

大于等于

<

小于

<=

小于等于

!=

不等于

  • 比较器

比较器

描述

BinaryComparator

匹配完整字节数组

BinaryPrefixComparator

匹配字节数组前缀

BitComparator

匹配比特位

NullComparator

匹配空值

RegexStringComparator

匹配正则表达式

SubstringComparator

匹配子字符串

  • 比较器表达式

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

比较器

表达式语言缩写

BinaryComparator

binary:值

BinaryPrefixComparator

binaryprefix:值

BitComparator

bit:值

NullComparator

null

RegexStringComparator

regexstring:正则表达式

SubstringComparator

substring:值


实例演示
  • 使用RowFilter查询指定订单ID的数据
  • 只查询订单的ID为:02602f66-adc7-40d4-8485-76b5632b5b53、订单状态以及支付方式

分析

  1. 因为要订单ID就是ORDER_INFO表的rowkey,所以,我们应该使用rowkey过滤器来过滤
  2. 通过HBase的JAVA API,找到RowFilter构造器
在这里插入图片描述
在这里插入图片描述

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

  • op——比较运算符
  • rowComparator——比较器

所以构建该Filter的时候,只需要传入两个参数即可

代码语言:javascript
复制
scan 'ORDER_INFO', {FILTER => "RowFilter(=,'binary:02602f66-adc7-40d4-8485-76b5632b5b53')"}

  • 查询状态为已付款的订单

分析

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

需要传入四个参数:

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

注意:

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

HBase是无模式的,不会检查或验证列族或列名是否存在或拼写是否正确。如果列族或列名拼写错误,HBase不会报错,但是查询不会返回数据。因此,需要非常小心地输入列族和列名,并且在查询之前应该先验证它们是否正确。可以通过使用HBase Shell或HBase API来验证列族和列名是否正确。

代码语言:javascript
复制
scan 'ORDER_INFO', {FILTER => "SingleColumnValueFilter('C1', 'STATUS', =, 'binary:已付款')", FORMATTER => 'toString'}

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

分析

  • 此处需要使用多个过滤器共同来实现查询,多个过滤器,可以使用AND或者OR来组合多个过滤器完成查询
  • 使用SingleColumnValueFilter实现对应列的查询
  1. 查询支付方式为1
代码语言:javascript
复制
SingleColumnValueFilter('C1', 'PAYWAY', = , 'binary:1')
  1. 查询金额大于3000的订单
代码语言:javascript
复制
SingleColumnValueFilter('C1', 'PAY_MONEY', > , 'binary:3000')
  1. 组合查询
代码语言:javascript
复制
scan 'ORDER_INFO', {FILTER => "SingleColumnValueFilter('C1', 'PAYWAY', = , 'binary:1') AND SingleColumnValueFilter('C1', 'PAY_MONEY', > , 'binary:3000')", FORMATTER => 'toString'}

注意:

  • HBase shell中比较默认都是字符串比较,所以如果是比较数值类型的,会出现不准确的情况
  • 例如:在字符串比较中4000是比100000大的

HBase shell默认将所有输入都视为字符串类型,因此在比较数值类型时可能会出现问题。例如,将两个整数进行比较,它们将按字典序进行比较,而不是数值大小。这可能会导致不准确的结果。要避免这种情况,可以使用HBase shell提供的类型转换函数,例如toInt和toFloat,将字符串转换为相应的数值类型,以进行正确的比较。


INCR

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

该表格数据如下所示:

新闻ID

访问次数

时间段

ROWKEY

0000000001

12

00:00-01:00

0000000001_00:00-01:00

0000000002

12

01:00-02:00

0000000002_01:00-02:00

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

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

注意:

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

导入测试数据:

代码语言:javascript
复制
# 创建表
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
incr 'NEWS_VISIT_CNT','0000000036_00:00-01:00','C1:CNT',98
incr 'NEWS_VISIT_CNT','0000000037_01:00-02:00','C1:CNT',7
incr 'NEWS_VISIT_CNT','0000000038_00:00-01:00','C1:CNT',0
incr 'NEWS_VISIT_CNT','0000000039_01:00-02:00','C1:CNT',0
incr 'NEWS_VISIT_CNT','0000000040_02:00-03:00','C1:CNT',9
incr 'NEWS_VISIT_CNT','0000000041_01:00-02:00','C1:CNT',8
incr 'NEWS_VISIT_CNT','0000000042_02:00-03:00','C1:CNT',9
incr 'NEWS_VISIT_CNT','0000000043_00:00-01:00','C1:CNT',3
incr 'NEWS_VISIT_CNT','0000000044_01:00-02:00','C1:CNT',5
incr 'NEWS_VISIT_CNT','0000000045_01:00-02:00','C1:CNT',4
incr 'NEWS_VISIT_CNT','0000000046_02:00-03:00','C1:CNT',7
incr 'NEWS_VISIT_CNT','0000000047_01:00-02:00','C1:CNT',0
incr 'NEWS_VISIT_CNT','0000000048_02:00-03:00','C1:CNT',0

put 'NEWS_VISIT_CNT','0000000001_00:00-01:00','C1:TIME_RANGE','00:00-01:00'
put 'NEWS_VISIT_CNT','0000000002_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000003_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000004_00:00-01:00','C1:TIME_RANGE','00:00-01:00'
put 'NEWS_VISIT_CNT','0000000005_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000006_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000007_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000008_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000009_00:00-01:00','C1:TIME_RANGE','00:00-01:00'
put 'NEWS_VISIT_CNT','0000000010_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000011_00:00-01:00','C1:TIME_RANGE','00:00-01:00'
put 'NEWS_VISIT_CNT','0000000012_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000013_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000014_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000015_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000016_00:00-01:00','C1:TIME_RANGE','00:00-01:00'
put 'NEWS_VISIT_CNT','0000000017_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000018_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000019_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000021_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000022_00:00-01:00','C1:TIME_RANGE','00:00-01:00'
put 'NEWS_VISIT_CNT','0000000023_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000024_00:00-01:00','C1:TIME_RANGE','00:00-01:00'
put 'NEWS_VISIT_CNT','0000000025_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000026_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000027_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000028_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000029_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000030_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000031_00:00-01:00','C1:TIME_RANGE','00:00-01:00'
put 'NEWS_VISIT_CNT','0000000032_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000033_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000034_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000035_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000036_00:00-01:00','C1:TIME_RANGE','00:00-01:00'
put 'NEWS_VISIT_CNT','0000000037_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000038_00:00-01:00','C1:TIME_RANGE','00:00-01:00'
put 'NEWS_VISIT_CNT','0000000039_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000040_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000041_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000042_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000043_00:00-01:00','C1:TIME_RANGE','00:00-01:00'
put 'NEWS_VISIT_CNT','0000000044_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000045_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000046_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
put 'NEWS_VISIT_CNT','0000000047_01:00-02:00','C1:TIME_RANGE','01:00-02:00'
put 'NEWS_VISIT_CNT','0000000048_02:00-03:00','C1:TIME_RANGE','02:00-03:00'
exit

该脚本创建了一个表,名为NEWS_VISIT_CNT,列蔟为C1。

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

  • 导入测试数据
代码语言:javascript
复制
hbase shell /export/software/NEWS_VISIT_CNT.txt 
scan 'NEWS_VISIT_CNT', {LIMIT => 5, FORMATTER => 'toString'}
在这里插入图片描述
在这里插入图片描述

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

  • 获取0000000020这条新闻在01:00-02:00当前的访问次数
代码语言:javascript
复制
get_counter 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:CNT'

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

在这里插入图片描述
在这里插入图片描述
  • 使用incr进行累加
代码语言:javascript
复制
incr 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:CNT'
  • 再次查询新闻当前的访问次数
代码语言:javascript
复制
get_counter 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:CNT'
在这里插入图片描述
在这里插入图片描述

更多的操作

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


Shell管理操作

status

例如:显示服务器状态

在这里插入图片描述
在这里插入图片描述

whoami

显示HBase当前用户,例如:

在这里插入图片描述
在这里插入图片描述

list

显示当前所有的表

在这里插入图片描述
在这里插入图片描述

count

统计指定表的记录数,例如:

在这里插入图片描述
在这里插入图片描述

describe

展示表结构信息

在这里插入图片描述
在这里插入图片描述

exists

检查表是否存在,适用于表量特别多的情况

在这里插入图片描述
在这里插入图片描述

is_enabled、is_disabled

检查表是否启用或禁用

在这里插入图片描述
在这里插入图片描述

alter

该命令可以改变表和列蔟的模式,例如:

代码语言:javascript
复制
# 创建一个USER_INFO表,两个列蔟C1、C2
create 'USER_INFO', 'C1', 'C2'
# 新增列蔟C3
alter 'USER_INFO', 'C3'
# 删除列蔟C3
alter 'USER_INFO', 'delete' => 'C3'

注意:

  • ‘delete’ => ‘C3’,还是一个Map结构,只不过只有一个key,可以省略两边的{}

disable/enable

禁用一张表/启用一张表

drop

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

truncate

清空表的数据,禁用表-删除表-创建表


本部分思维导图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Hbase入门篇02---数据模型和基本使用
  • 单元格 (cell)
  • 概念模型
  • shell命令行进行CRUD操作
    • 表的CRUD
      • 数据的CRUD
        • 数据批量导入
          • 计数操作
            • 大量数据的计数统计
              • 扫描操作
                • limit限制返回条数
                • 返回指定列
                • 返回指定行键对应的数据
              • 过滤器
                • HBase中的过滤器
                • 过滤器的用法
              • INCR
                • 更多的操作
                  • Shell管理操作
                    • status
                    • whoami
                    • list
                    • count
                    • describe
                    • exists
                    • is_enabled、is_disabled
                    • alter
                    • disable/enable
                    • drop
                    • truncate
                • 本部分思维导图
                相关产品与服务
                对象存储
                对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档