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的基本语法:

  1. DDL操作:创建、修改、删除表
  2. DML操作:插入、查询、删除、扫描数据
  3. 命名规范:表名、列族、列限定符命名规则
  4. 过滤器:基本过滤器和比较器使用
  5. 工具命令:集群状态、表状态管理

下一步,让我们学习HBase的数据类型!

最后更新:2026-03-27