HBase基础语法 #
一、HBase Shell简介 #
HBase Shell是基于Ruby的交互式命令行工具,用于管理HBase数据库。通过Shell可以执行DDL(数据定义语言)和DML(数据操作语言)操作。
1.1 进入Shell #
bash
# 进入HBase Shell
hbase shell
# 查看帮助
help
# 查看特定命令帮助
help 'create'
help 'put'
# 退出Shell
exit
1.2 Shell命令分类 #
text
HBase Shell命令
├── DDL(数据定义)
│ ├── create 创建表
│ ├── alter 修改表
│ ├── disable 禁用表
│ ├── enable 启用表
│ ├── drop 删除表
│ └── describe 查看表结构
│
├── DML(数据操作)
│ ├── put 插入/更新数据
│ ├── get 查询数据
│ ├── delete 删除数据
│ ├── scan 扫描表
│ └── count 统计行数
│
├── 命名空间操作
│ ├── create_namespace 创建命名空间
│ ├── list_namespace 列出命名空间
│ └── drop_namespace 删除命名空间
│
└── 工具命令
├── status 集群状态
├── version 版本信息
└── whoami 当前用户
二、命名规范 #
2.1 表名规范 #
text
命名规则:
1. 只能包含字母、数字、下划线(_)和连字符(-)
2. 必须以字母或下划线开头
3. 不区分大小写(存储时自动转为小写)
4. 最大长度:255字符
推荐命名:
- user_info 用户信息表
- order_detail 订单明细表
- log_access 访问日志表
- t_user 临时用户表
不推荐:
- 1table 以数字开头
- user-info 包含连字符(可能引起混淆)
- user info 包含空格
2.2 列族命名规范 #
text
命名规则:
1. 简短有意义
2. 通常使用小写
3. 建议控制在1-3个字符
推荐命名:
- cf 通用列族
- i 信息列族
- d 数据列族
- h 历史列族
示例:
create 'user', 'i', 'h' # 信息列族和历史列族
2.3 列限定符命名规范 #
text
命名规则:
1. 描述性强
2. 可读性好
3. 避免过长
推荐命名:
- name 姓名
- age 年龄
- created_at 创建时间
- updated_at 更新时间
三、命名空间操作 #
3.1 创建命名空间 #
ruby
# 创建命名空间
create_namespace 'myapp'
# 带属性创建
create_namespace 'myapp', {'creator' => 'admin', 'purpose' => 'production'}
3.2 查看命名空间 #
ruby
# 列出所有命名空间
list_namespace
# 查看命名空间详情
describe_namespace 'myapp'
3.3 修改命名空间 #
ruby
# 添加属性
alter_namespace 'myapp', {METHOD => 'set', 'owner' => 'dev'}
# 删除属性
alter_namespace 'myapp', {METHOD => 'unset', NAME => 'owner'}
3.4 删除命名空间 #
ruby
# 删除命名空间(必须为空)
drop_namespace 'myapp'
四、DDL操作 #
4.1 创建表 #
ruby
# 基本创建
create 'user', 'info'
# 创建多列族表
create 'user', 'info', 'history', 'settings'
# 指定版本数
create 'user', {NAME => 'info', VERSIONS => 5}
# 完整属性创建
create 'user',
{NAME => 'info', VERSIONS => 3, TTL => 2592000},
{NAME => 'history', VERSIONS => 10, COMPRESSION => 'SNAPPY'}
# 在命名空间中创建表
create 'myapp:user', 'info'
# 预分区创建
create 'user', 'info', SPLITS => ['10', '20', '30', '40']
# 按分区文件创建
create 'user', 'info', SPLITS_FILE => '/path/to/splits.txt'
4.2 查看表 #
ruby
# 列出所有表
list
# 列出命名空间中的表
list 'myapp:.*'
# 查看表结构
describe 'user'
# 简洁格式
describe 'user', 'SIMPLE'
4.3 修改表 #
ruby
# 表必须先禁用(部分操作)
disable 'user'
# 添加列族
alter 'user', NAME => 'address'
# 删除列族
alter 'user', NAME => 'address', METHOD => 'delete'
# 修改列族属性
alter 'user', {NAME => 'info', VERSIONS => 5}
# 修改多个属性
alter 'user',
{NAME => 'info', VERSIONS => 5, TTL => 86400},
{NAME => 'history', COMPRESSION => 'GZ'}
# 重新启用表
enable 'user'
4.4 禁用/启用表 #
ruby
# 禁用表
disable 'user'
# 检查是否禁用
is_disabled 'user'
# 启用表
enable 'user'
# 检查是否启用
is_enabled 'user'
4.5 删除表 #
ruby
# 必须先禁用
disable 'user'
# 删除表
drop 'user'
# 禁用并删除(组合命令)
disable 'user'
drop 'user'
# 截断表(清空数据,保留结构)
truncate 'user'
五、DML操作 #
5.1 插入数据 #
ruby
# 基本插入
put 'user', 'user001', 'info:name', '张三'
put 'user', 'user001', 'info:age', '25'
put 'user', 'user001', 'info:email', 'zhangsan@example.com'
# 指定时间戳插入
put 'user', 'user001', 'info:name', '张三丰', 1700000000000
# 插入多列族数据
put 'user', 'user001', 'history:login_time', '2024-01-01 10:00:00'
5.2 查询数据 #
ruby
# 查询整行
get 'user', 'user001'
# 查询指定列族
get 'user', 'user001', 'info'
# 查询指定列
get 'user', 'user001', 'info:name'
# 查询多个列
get 'user', 'user001', ['info:name', 'info:age']
# 查询指定版本
get 'user', 'user001', {COLUMN => 'info:name', VERSIONS => 3}
# 查询指定时间范围
get 'user', 'user001', {COLUMN => 'info:name', TIMERANGE => [1700000000000, 1700086400000]}
5.3 删除数据 #
ruby
# 删除指定列
delete 'user', 'user001', 'info:age'
# 删除指定版本
delete 'user', 'user001', 'info:name', 1700000000000
# 删除整行
deleteall 'user', 'user001'
# 删除指定列族
deleteall 'user', 'user001', 'info'
5.4 扫描表 #
ruby
# 全表扫描
scan 'user'
# 扫描指定列族
scan 'user', {COLUMN => 'info'}
# 扫描指定列
scan 'user', {COLUMN => ['info:name', 'info:age']}
# 指定行范围
scan 'user', {STARTROW => 'user001', STOPROW => 'user005'}
# 限制返回行数
scan 'user', {LIMIT => 10}
# 指定版本数
scan 'user', {VERSIONS => 3}
# 时间范围
scan 'user', {TIMERANGE => [1700000000000, 1700086400000]}
# 反向扫描
scan 'user', {REVERSED => true}
# 组合条件
scan 'user', {
COLUMN => 'info',
STARTROW => 'user001',
STOPROW => 'user010',
LIMIT => 5,
VERSIONS => 2
}
5.5 统计行数 #
ruby
# 统计表行数
count 'user'
# 指定间隔显示
count 'user', INTERVAL => 1000
# 使用缓存加速
count 'user', INTERVAL => 1000, CACHE => 10000
六、高级操作 #
6.1 原子操作 #
ruby
# 检查并插入(CAS)
checkAndPut 'user', 'user001', 'info:age', '25',
'info:updated', '2024-01-01'
# 检查并删除
checkAndDelete 'user', 'user001', 'info:age', '25',
'info:age'
6.2 追加操作 #
ruby
# 追加数据
append 'user', 'user001', 'info:tags', ',vip'
6.3 增量操作 #
ruby
# 计数器增量
incr 'user', 'user001', 'info:login_count'
# 指定增量值
incr 'user', 'user001', 'info:login_count', 5
# 获取计数器值
get_counter 'user', 'user001', 'info:login_count'
七、批量操作 #
7.1 批量插入脚本 #
ruby
# 创建批量插入脚本 batch_put.rb
import org.apache.hadoop.hbase.util.Bytes
import org.apache.hadoop.hbase.client.Put
table = connection.getTable(TableName.valueOf('user'))
puts = []
(1..1000).each do |i|
rowkey = "user%03d" % i
put = Put.new(Bytes.toBytes(rowkey))
put.addColumn(Bytes.toBytes('info'), Bytes.toBytes('name'), Bytes.toBytes("用户#{i}"))
puts << put
end
table.put(puts)
7.2 执行脚本 #
bash
# 在Shell中执行
hbase shell batch_put.rb
# 或在Shell内执行
exec 'batch_put.rb'
八、过滤器语法 #
8.1 基本过滤器 #
ruby
# 值过滤器
scan 'user', {FILTER => "ValueFilter(=, 'binary:张三')"}
# 前缀过滤器
scan 'user', {FILTER => "PrefixFilter('user00')"}
# 行键过滤器
scan 'user', {FILTER => "RowFilter(=, 'binary:user001')"}
# 列名过滤器
scan 'user', {FILTER => "QualifierFilter(=, 'binary:name')"}
# 列族过滤器
scan 'user', {FILTER => "FamilyFilter(=, 'binary:info')"}
8.2 比较运算符 #
text
= 等于
!= 不等于
> 大于
>= 大于等于
< 小于
<= 小于等于
8.3 比较器 #
text
binary:value 二进制值比较
binaryprefix:value 二进制前缀比较
regexstring:pattern 正则表达式比较
substring:value 子字符串匹配
九、工具命令 #
9.1 集群状态 #
ruby
# 查看集群状态
status
# 简洁格式
status 'simple'
# 详细格式
status 'detailed'
# Master状态
status 'master'
9.2 表状态 #
ruby
# 检查表是否存在
exists 'user'
# 查看表是否启用
is_enabled 'user'
# 查看表是否禁用
is_disabled 'user'
9.3 Region管理 #
ruby
# 查看表的Region分布
describe 'user'
# 手动触发Major Compaction
major_compact 'user'
# 手动触发Region切分
split 'user', 'user005'
# 移动Region
move 'region_encoded_name', 'server_name'
十、常用命令速查表 #
10.1 DDL命令 #
| 命令 | 说明 | 示例 |
|---|---|---|
| create | 创建表 | create 't', 'cf' |
| list | 列出表 | list |
| describe | 查看表结构 | describe 't' |
| alter | 修改表 | alter 't', NAME => 'cf2' |
| disable | 禁用表 | disable 't' |
| enable | 启用表 | enable 't' |
| drop | 删除表 | drop 't' |
| truncate | 截断表 | truncate 't' |
10.2 DML命令 #
| 命令 | 说明 | 示例 |
|---|---|---|
| put | 插入数据 | put 't', 'r', 'cf:c', 'v' |
| get | 查询数据 | get 't', 'r' |
| scan | 扫描表 | scan 't' |
| delete | 删除数据 | delete 't', 'r', 'cf:c' |
| deleteall | 删除整行 | deleteall 't', 'r' |
| count | 统计行数 | count 't' |
| incr | 计数器增量 | incr 't', 'r', 'cf:c' |
十一、总结 #
本节介绍了HBase Shell的基本语法:
- DDL操作:创建、修改、删除表
- DML操作:插入、查询、删除、扫描数据
- 命名规范:表名、列族、列限定符命名规则
- 过滤器:基本过滤器和比较器使用
- 工具命令:集群状态、表状态管理
下一步,让我们学习HBase的数据类型!
最后更新:2026-03-27