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

news2025/1/11 15:10:48

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

  • HBase数据模型
    • 单元格 (cell)
    • 概念模型
  • shell命令行进行CRUD操作
    • 表的CRUD
    • 数据的CRUD
    • 数据批量导入
    • 计数操作
    • 大量数据的计数统计
    • 扫描操作
      • limit限制返回条数
      • 返回指定列
      • 返回指定行键对应的数据
    • 过滤器
      • HBase中的过滤器
      • 过滤器的用法
        • 实例演示
    • INCR
    • 更多的操作
    • Shell管理操作
      • status
      • whoami
      • list
      • count
      • describe
      • exists
      • is_enabled、is_disabled
      • alter
      • disable/enable
      • drop
      • truncate


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)

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

在这里插入图片描述

ROWCOLUMN+CELL
1250995column=C1:ADDRESS, timestamp=1588591604729, value=\xC9\xBD\xCE\xF7\xCA
1250995column=C1:LATEST_DATE, timestamp=1588591604729, value=2019-03-28
1250995column=C1:NAME, timestamp=1588591604729, value=\xB7\xBD\xBA\xC6\xD0\xF9
1250995column=C1:NUM_CURRENT, timestamp=1588591604729, value=398.5
1250995column=C1:NUM_PREVIOUS, timestamp=1588591604729, value=379.5
1250995column=C1:NUM_USEAGE, timestamp=1588591604729, value=19
1250995column=C1:PAY_DATE, timestamp=1588591604729, value=2019-02-26
1250995column=C1:RECORD_DATE, timestamp=1588591604729, value=2019-02-11
1250995column=C1:SEX, timestamp=1588591604729, value=\xC5\xAE
1250995column=C1:TOTAL_MONEY, timestamp=1588591604729, value=114

概念模型

Row KeyTime StampColumnFamily contentsColumnFamily anchorColumnFamily people
“com.cnn.www”t9anchor:cnnsi.com = “CNN”
“com.cnn.www”t8anchor:my.look.ca = “CNN.com”
“com.cnn.www”t6contents:html = “…”
“com.cnn.www”t5contents:html = “…”
“com.cnn.www”t3contents:html = “…”
“com.example.www”t5contents: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
hbase shell
  • 创建表
    • 语法: create '表名','列蔟名'...
# 创建订单表,表名为ORDER_INFO,该表有一个列蔟为C1
create 'ORDER_INFO','C1'

注意:

  • create要写成小写
  • 一个表可以包含若干个列蔟
  • 命令解析:调用hbase提供的ruby脚本的create方法,传递两个字符串参数
  • 通过下面链接可以看到每个命令都是一个ruby脚本: https://github.com/apache/hbase/tree/branch-2.1/hbase-shell/src/main/ruby/shell/commands

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

在这里插入图片描述


  • 查看表
list

在这里插入图片描述

  • 删除表 (要删除某个表,必须要先禁用表)
    • 禁用表
      • 语法:disable “表名”
    • 删除表
      • 语法:drop “表名”
#删除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一个单元格的值

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'
get 'ORDER_INFO','000001'

在这里插入图片描述


  • 显示中文
    • 在HBase shell中,如果在数据中出现了一些中文,默认HBase shell中显示出来的是十六进制编码。
    • 要想将这些编码显示为中文,我们需要在get命令后添加一个属性:{FORMATTER => 'toString'}
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命令来进行数据的更新,语法与之前的添加数据一模一样。
put 'ORDER_INFO', '000001', 'C1:STATUS', '已付款'

注意:

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

  • DELETE
    • 在HBase中,可以使用delete命令来将一个单元格的数据删除。
    • 语法格式如下:
      • delete '表名', 'rowkey', '列蔟:列'。
    • 注意:此处HBase默认会保存多个时间戳的版本数据,所以这里的delete删除的是最新版本的列数据。
  • 删除指定的列
delete 'ORDER_INFO','000001','C1:STATUS'
  • 删除整行数据
    • deleteall命令
      • deleteall命令可以将指定rowkey对应的所有列全部删除。
      • 语法:
        • deleteall '表名','rowkey'
deleteall 'ORDER_INFO','000001'
  • HBase删除一个列的数据,可能会存在一定的延时,因为一些系统的卡顿,执行写入,读取是非常快的
  • 删除数据的时候,其实HBase不是真正把数据删除掉,而是给某个列设置一个标记,然后查询数据的时候,有这个标志的数据,就不显示出来
  • 后台存在进程,专门来执行删除数据的操作
  • 执行delete的时候
    • 如果表中某个列经过了几次修改,那么会删除最近一次修改
    • 默认是保存三个最近修改的版本(version),版本使用时间戳表示

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

数据批量导入

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

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

在这里插入图片描述

  • 将该数据集文件上传到指定的目录中
  • 使用以下命令执行:
hbase shell /export/software/ORDER_INFO.txt

计数操作

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

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

  • 语法:count ‘表名’

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

  • 获取订单数据
count 'ORDER_INFO'

在这里插入图片描述


大量数据的计数统计

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

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

具体步骤:

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

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

在这里插入图片描述


扫描操作

  • scan命令
    • 在HBase,我们可以使用scan命令来扫描HBase中的表。
    • 语法:
      • scan '表名'
# {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限制返回条数

  • 限制只返回三条数据
scan 'ORDER_INFO', {LIMIT => 3, FORMATTER => 'toString'}

返回指定列

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

注意:

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

返回指定行键对应的数据

  • 根据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'}

过滤器

在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

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
rowkey 过滤器RowFilter实现行键字符串的比较和过滤
PrefixFilterrowkey前缀过滤器
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的过滤器该如何使用。

scan '表名', { Filter => "过滤器(比较运算符, '比较器表达式')}
  • 比较运算符
比较运算符描述
=等于
>大于
>=大于等于
<小于
<=小于等于
!=不等于
  • 比较器
比较器描述
BinaryComparator匹配完整字节数组
BinaryPrefixComparator匹配字节数组前缀
BitComparator匹配比特位
NullComparator匹配空值
RegexStringComparator匹配正则表达式
SubstringComparator匹配子字符串
  • 比较器表达式

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

比较器表达式语言缩写
BinaryComparatorbinary:值
BinaryPrefixComparatorbinaryprefix:值
BitComparatorbit:值
NullComparatornull
RegexStringComparatorregexstring:正则表达式
SubstringComparatorsubstring:值

实例演示

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

分析

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

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

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

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

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来验证列族和列名是否正确。

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

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

分析

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

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

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

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


INCR

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

该表格数据如下所示:

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

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

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

注意:

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

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


导入测试数据:

# 创建表
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的缩写,表示访问的次数。

  • 导入测试数据
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当前的访问次数
get_counter 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:CNT'

此处,如果用get获取到的数据是这样的:
在这里插入图片描述

  • 使用incr进行累加
incr 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:CNT'
  • 再次查询新闻当前的访问次数
get_counter 'NEWS_VISIT_CNT','0000000020_01:00-02:00','C1:CNT'

在这里插入图片描述


更多的操作

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

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

Shell管理操作

status

例如:显示服务器状态

在这里插入图片描述

whoami

显示HBase当前用户,例如:

在这里插入图片描述

list

显示当前所有的表
在这里插入图片描述

count

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

在这里插入图片描述

describe

展示表结构信息

在这里插入图片描述

exists

检查表是否存在,适用于表量特别多的情况
在这里插入图片描述

is_enabled、is_disabled

检查表是否启用或禁用
在这里插入图片描述

alter

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

# 创建一个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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/513692.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【云原生进阶之PaaS中间件】第一章Redis-1.2数据类型

1 Redis 数据类型 Redis支持五种数据类型&#xff1a;string&#xff08;字符串&#xff09;&#xff0c;hash&#xff08;哈希&#xff09;&#xff0c;list&#xff08;列表&#xff09;&#xff0c;set&#xff08;集合&#xff09;及zset(sorted set&#xff1a;有序集合)。…

XML配置方式使用Spring MVC:实战练习

文章目录 任务1、设置项目首页 - index.jsp1、修改web.xml文件2、创建首页文件3、修改登录控制器4、启动服务器&#xff0c;查看效果 任务2、首页添加登录链接&#xff0c;单击跳转到登录页面1、修改首页文件2、修改登录控制器3、启动服务器&#xff0c;查看效果 任务3、利用Sp…

预测性维护无线振动监测方案QA合集

一、虹科无线振动监测方案 虹科无线振动监测方案具有高安全性、高可靠性、全自动诊断的优势&#xff0c;广泛应用于各种旋转设备的故障诊断。虹科无线振动监测方案包括Accel 310高分辨率无线振动系统&#xff0c;用户能够实现每小时获取标量数据或每日诊断监控机器状态。借助先…

PostgreSQL(五)JDBC连接串常用参数

目录 1.单机 PostgreSQL 连接串2.集群PostgreSQL 连接串 PostgreSQL JDBC 官方驱动下载地址&#xff1a; https://jdbc.postgresql.org/download/ PostgreSQL JDBC 官方参数说明文档&#xff1a; https://jdbc.postgresql.org/documentation/use/ 驱动类&#xff1a; driver-…

yarn切换element-plus版本

yarn的安装和卸载 npm install -g yarn npm uninstall yarn -g //yarn卸载 本机的element-plus版本 "element-plus": "2.0.1", 想要切换的element-plus版本 由于我需要用到树型选择&#xff0c;所以需要升级到2.1.8 用npm卸载element-plus时报如下错误…

Scala学习(三)---函数式编程

文章目录 1.面向对象编程2. 函数式编程是什么3.函数定义4.函数参数的特殊用法5.函数至简原则6.匿名函数6.1 匿名函数化简原则 7.高阶函数7.1 函数可以作为值进行传递7.2 函数可以作为参数进行传递7.3 函数可以作为返回值进行传递7.4 柯里化写法 1.面向对象编程 Scala语言是一个…

解决Uncaught SyntaxError: Unexpected reserved word

解决思路&#xff1a; 首先&#xff0c;我运行项目报错&#xff0c;我查看了一下node版本&#xff0c;是否太低&#xff0c; 如果是14版本的话&#xff0c;那么node需要升级&#xff0c; 目前&#xff0c;node已经升级到19&#xff0c;升级到16即可&#xff0c;无需太高 更…

❤ 微信原生小程序的使用

❤ 微信原生小程序的使用 运行提示&#xff1a; Provisional headers are shown 微信小程序请求远程服务器接口时&#xff0c;响应非常慢&#xff0c;最后请求超时&#xff0c;导致失败。网络那里提示 provisional headers are shown警告 原因&#xff1a; 原因有很多&#…

什么人间悲剧,面试被刷了还要被HR怼.....

前一阵子向朋友诉苦&#xff0c;我在参加字节跳动面试的时候被面试官怼得哑口无言&#xff0c;场面让我一度十分尴尬。 印象最深的就是下面几个问题&#xff1a; 根据你以前的工作经验和学习到的测试技术&#xff0c;说说你对质量保证的理解&#xff1f; 非关系型数据库和关系型…

内网:bloodhound域渗透分析工具

目录 neo4j window下载 社区版neo4j kali下载 BloodHound BloodHound 使用 介绍&#xff1a; 利用BloodHound对庞大内网域环境进行自动化信息搜集并整理分析数据&#xff0c;提高渗透效率。BloodHound是一款可视化图形分析域环境中的关系的工具&#xff0c;…

ES 权威指南

一、检索文档 1.1 检索文档的一部分 通常&#xff0c; GET 请求将返回文档的全部&#xff0c; 存储在 _source 参数中。 但是可能你感兴趣的字段只是 title 。 请求个别字段可以使 用 _source 参数。 多个字段可以使用逗号分隔&#xff1a; GET /website/blog/123?_sourcetit…

ios 打包静态库

前言&#xff1a; 各位同学大家&#xff0c; 有段时间没有跟大家见面了。 相信很多做IOS手游sdk 的同学 都会用到静态库&#xff0c; 我们不用把我们都源代码都发给对接方 就可以把我们的逻辑跟研发都代码融合在一起 具体实现&#xff1a; 第一步 点击file 第二步创建一个p…

ES6中将非数组转换为数组的三种方法

大厂面试题分享 面试题库 前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 web前端面试题库 VS java后端面试题库大全 我们常常想使用数组的方法&#xff0c;比如forEach&#xff0c;filter&#xff0c;又或者so…

解决 CentOS 7 内核安全漏洞 CESA-2018:3651 报错

如果你的 CentOS 7 服务器在安全测试时出现 kernel (CESA-2018:3651) 报错&#xff0c;那么您的服务器存在内核安全漏洞&#xff0c;需要更新修补。本文将介绍如何解决这个问题。 查看当前内核版本 在进行内核更新之前&#xff0c;您需要先查看当前服务器所使用的内核版本。可…

本地部署 MiniGPT-4

本地部署 MiniGPT-4 1. 什么是 MiniGPT-42. Github 地址3. 安装 MiniGPT-44. 准备预训练的 MiniGPT-4 checkpoint5. 在本地启动演示其他 1&#xff0c;安装 CUDA Toolkit 11.8其他 2&#xff0c;安装 GCC 9 版本&#xff0c;并设置为默认GCC版本其他 3(成功)&#xff0c;重新安…

Shell脚本管道符常用搭配命令(我在人间贩卖黄昏,只为收集世间温柔去见你)

文章目录 1.sort2.uniq3.tr5.split6.paste7.eval 1.sort sort命令——以行为单位对文件内容进行排序&#xff0c;也可以根据不同的数据类型来排序比较原则是从首字符向后&#xff0c;依次按ASCII码值进行比较&#xff0c;最后将他们按升序输出。 sort [选项] 文件名 cat file …

Java版企业电子采购招标系统源码

一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点&#xff1a;对草稿进行编辑&#x…

UNIAPP实战项目笔记65 获取当前用户购物车数据的前端和后端交互

UNIAPP实战项目笔记65 获取当前用户购物车数据的前端和后端交互 思路 构建数据库表 前端数据存入vuex中shop.js的list中 list自动同步到后端数据&#xff0c; 后端相应前端请求数据 实例截图 ##代码 前端代码首批cart.vue <template><view class"shop-cart&quo…

两种知识库软件:BookStack和DokuWiKi在Debian12中的安装

一、BookStack的安装 1. 架设 LNMP系统环境 Debian12、php8.2-fpm、 nginx 2. 下载bookstack源码 3. 按照官网说明进行手动安装。 注意1&#xff1a;composer命令的安装&#xff0c;针对php的命令 下载、更名、安装 wget https://getcomposer.org/installer mv installer…

AI文章创作助手有什么特点

在当今信息爆炸的时代&#xff0c;文章创作已成为各行业必备技能。然而&#xff0c;如何高效地创作出质量优异且独具创意的文章仍是一个艰巨的挑战。AI文章创作助手应势而生&#xff0c;利用领先的自然语言处理和知识图谱技术&#xff0c;拥有丰富的自动创作和辅助创作能力&…