HBase学习笔记-入门(4)-HBase的Shell操作
HBase Shell
HBase数据库默认的客户端程序是HBase
Shell,这是一个命令行工具,类似于MySQL客户端启动后出现的命令行Shell。在启动HBase集群之后(同时配置了环境变量),在命令行中输入hbase shell
即可进入。
HBase Shell是一个封装了Java客户端API的JRuby应用软件,其中提供的命令可以理解成为是Ruby函数的调用,每个命令都是一个Ruby脚本,后面跟着的参数为传入的参数,具体格式在后续进行说明。在下面链接中列出了在HBase Shell中可用的所有脚本:
hbase/hbase-shell/src/main/ruby/shell/commands at master · apache/hbase (github.com)
在 Shell
中输入help
可以获取可用命令列表,输入help commandname
可获取特定命令的帮助,还可以输入各种命令查看集群、数据库和数据的各项详情。
- 使用
status
命令查看当前集群各节点的状态 - 使用
version
命令查看当前 HBase 的版本号 - 使用命令
exit
或quit
即可退出 HBase Shell - 使用
whoami
命令显示当前用户
HBase Shell提供的命令可以大致分为两类,一类是对数据表的管理命令,包括对表的创建,禁用,删除等操作;另一类是对表中数据的增删改查命令。
数据表管理命令
常用命令汇总:
命令 | 描述 |
---|---|
create | 创建指定模式的新表 |
alter | 修改表的结构,如添加新的列族等 |
describe | 展示表结构信息,包括列族的数量与属性等 |
list | 列出HBase中已有的表 |
exists | 判断某个表是否存在 |
disable / enable | 禁用 / 解禁一个表。在删除和更改表之前,需要禁用这个表 |
disable_all | 禁用所有的表,可以使用正则表达式匹配 |
is_disable | 判断一个表是否被禁用 |
drop | 删除表 |
truncate | 删除表中数据。truncate可以禁用表、删除表并自动重建表结构 |
命令使用:
1 |
|
前面提到HBase Shell命令都是Ruby脚本,可以理解为对Ruby函数的调用,不同的函数传入参数的形式不同。传入引号包裹的字符串就是传入字符串;传入
{}
包裹的参数,表示传入一个类似Map的结构,其中Map的每一个键值对有key => value
的格式,key一般是给定的参数,不使用引号标识;传入[]
包裹的参数,表示传入一个类似数组的结构
增删改查命令
常用命令汇总:
命令 | 描述 |
---|---|
put | 添加一个值到指定单元格中 |
get | 通过表名、行键等参数获取行或者单元格的数据 |
scan | 遍历表并输出满足指定条件的行记录 |
count | 计算表中的逻辑行数(会遍历所有的存储数据,谨慎使用) |
delete | 删除表中列族或者列的数据 |
deleteall | 删除逻辑行 |
命令使用:
1 |
|
需要注意的是,delete操作并不会马上删除数据,只会将对应的数据打上删除标记,在空闲合并数据的时候,数据才会被删除。同时delete删除的是最新版本的数据。
HBase过滤器
在HBase中,get和scan操作可以使用过滤器来设置输出的范围,增加查询的条件,类似于SQL里面的where条件。在HBase
Shell中使用show_filter
命令可以查看当前HBase支持的过滤器类型。过滤器的实现使用的是Java,HBase
Shell命令相当于封装了一层进行API的调用。
过滤器的语法格式如下:
1 |
|
- 过滤器表示过滤的层次,如行键过滤器、列族过滤器等
- 比较运算符即表示判断逻辑,如等于,大于,小于等
- 比较器表达式表示进行比较的值,如匹配完整字节数组,匹配子字符串等
过滤器可以在官方API中找到 org.apache.hadoop.hbase.filter
(Apache HBase 3.0.0-alpha-3-SNAPSHOT API)
。所在包为package org.apache.hadoop.hbase.filter
比较运算符:=
、>
、<
、>=
、<=
、!=
比较器:
比较器 | 表达式语言缩写 | 描述 |
---|---|---|
BinaryComparator | binary:value | 匹配完整字节数组 |
BinaryPrefixComparator | binaryprefix:value | 匹配字节数组前缀 |
BitComparator | bit:value | 匹配比特位 |
NullComparator | null | 匹配空值 |
RegexStringComparator | regexstring:正则表达式 | 匹配正则表达式 |
SubstringComparator | substring:value | 匹配子字符串 |
并且如果需要使用多个过滤器共同来实现查询,可以使用AND
或者OR
来组合多个过滤器来完成查询
但是需要注意的是,在HBase Shell中默认都是字符串比较,如果比较数值类型,可能会出现不准确的情况。
下面介绍一些常用的过滤器以及对应的使用方法。
行键过滤器
行键过滤器,RowFilter,可以实现对行键字符串的比较和过滤。
1 |
|
其他行键过滤器描述:
行键过滤器 | 描述 |
---|---|
PrefixFilter | 行键前缀比较器 |
KeyOnlyFilter | 只显示单元格的键(列族名:列标识符),不显示值 |
FirstKeyOnlyFilter | 对于每一行,只显示第一个单元格 |
InclusiveStopFilter | 指定终止条件行 |
1 |
|
列族与列过滤器
列族过滤器,FamilyFilter,根据列族字符串进行比较和过滤
1 |
|
其他列过滤器描述:
列过滤器 | 描述 |
---|---|
QualifierFilter | 列标识符过滤器,根据列标识符进行过滤 |
ColumnPrefixFilter | 对列标识符前缀进行过滤 |
MultipleColumnPrefixFilter | 可以指定多个前缀对列标识符进行过滤 |
ColumnRangeFilter | 过滤列标识符名称的范围,指定区间,同时可以指定区间开闭 |
1 |
|
值过滤器
值过滤器按照单元格的值进行匹配和过滤。
值过滤器 | 描述 |
---|---|
ValueFilter | 值过滤器,根据单元格中的值找到符合条件的键值对 |
SingleColumnValueFilter | 指定对应列族和列,按照定位到的值进行比较 |
SingleColumnValueExcludeFilter | 排除匹配成功的值,与上一个过滤器的扫描结果相反 |
1 |
|
其他过滤器
过滤器 | 描述 |
---|---|
ColumnCountGetFilter | 限制每个逻辑行中返回键值对的个数 |
TimestampsFilter | 根据时间戳进行过滤,可以同时设置多个时间戳 |
InclusiveStopFilter | 设置停止行,扫描到对应行就停止扫描 |
PageFilter | 对显示结果按行进行分页显示 |
ColumnPaginationFilter | 对一个逻辑行内的所有列进行分页,返回[offset, offset+limit]范围内的列 |
1 |
|
其他操作
数据上传与导出
我们可以通过一个txt文件来完成数据的上传,在这个txt文件中每一行都是一条能够在HBase
Shell中执行的命令。我们可以在HBase
Shell之外,在Linux命令行中执行下面的命令,将txt文件中的命令一次全部执行。这一过程类似于MySQL中对.sql
文件的source
操作
1 |
|
还可以使用提供的MapReduce程序进行数据上传,在HBase中提供了一个用于Import的MapReduce作业,专门用来将数据文件导入到HBase中,用法如下:
1 |
|
对应还存在一个数据导出的MapReduce程序:
1 |
|
大量数据的计数统计
当HBase中数据量大的时候,可以使用HBase中提供的MapReduce程序来进行计数统计,语法如下:
1 |
|
incr
incr可以实现对某个单元格的值进行原子性计数,语法如下:
1 |
|
如果某一列需要实现计数功能,必须使用incr来创建对应的列,使用put创建的列是不能实现累加功能的。
对于incr创建的列,需要使用get_counter来访问,格式与get命令类似。