HBase创建表 #
一、基本语法 #
1.1 创建表语法 #
ruby
# 基本语法
create '表名', '列族1', '列族2', ...
# 示例
create 'user', 'info'
create 'user', 'info', 'history', 'settings'
1.2 完整语法 #
ruby
# 完整语法
create '表名',
{NAME => '列族1', 属性1 => 值1, ...},
{NAME => '列族2', 属性1 => 值1, ...},
...配置选项...
# 示例
create 'user',
{NAME => 'info', VERSIONS => 3, TTL => 2592000},
{NAME => 'history', VERSIONS => 10, COMPRESSION => 'SNAPPY'},
SPLITS => ['10', '20', '30']
二、列族定义 #
2.1 列族属性 #
| 属性 | 默认值 | 说明 |
|---|---|---|
| NAME | 必填 | 列族名称 |
| VERSIONS | 1 | 保留版本数 |
| TTL | FOREVER | 数据存活时间(秒) |
| COMPRESSION | NONE | 压缩算法 |
| BLOOMFILTER | ROW | 布隆过滤器类型 |
| BLOCKSIZE | 65536 | HFile块大小(字节) |
| BLOCKCACHE | true | 是否启用块缓存 |
| IN_MEMORY | false | 是否常驻内存 |
| MIN_VERSIONS | 0 | TTL后保留的最小版本数 |
| REPLICATION_SCOPE | 0 | 复制范围 |
2.2 列族创建示例 #
ruby
# 简单创建
create 'user', 'info'
# 指定版本数
create 'user', {NAME => 'info', VERSIONS => 5}
# 指定TTL(7天)
create 'log', {NAME => 'data', TTL => 604800}
# 指定压缩
create 'user', {NAME => 'info', COMPRESSION => 'SNAPPY'}
# 多列族
create 'user',
{NAME => 'info', VERSIONS => 3},
{NAME => 'history', VERSIONS => 10, TTL => 2592000},
{NAME => 'settings', BLOOMFILTER => 'ROWCOL'}
# 完整属性
create 'user', {
NAME => 'info',
VERSIONS => 5,
TTL => 2592000,
COMPRESSION => 'SNAPPY',
BLOOMFILTER => 'ROW',
BLOCKSIZE => 65536,
BLOCKCACHE => true,
IN_MEMORY => false,
MIN_VERSIONS => 1
}
2.3 压缩算法选择 #
text
压缩算法对比
├── NONE
│ └── 无压缩,读写最快
│
├── SNAPPY
│ ├── 压缩比约2:1
│ ├── 压缩/解压速度快
│ └── 推荐:实时读写场景
│
├── LZO
│ ├── 压缩比约2.5:1
│ ├── 速度快
│ └── 推荐:平衡场景
│
├── GZ (GZIP)
│ ├── 压缩比约4:1
│ ├── 压缩/解压较慢
│ └── 推荐:冷数据、归档
│
├── LZ4
│ ├── 压缩比约2.5:1
│ ├── 速度最快
│ └── 推荐:高性能场景
│
└── ZSTD
├── 压缩比约3:1
├── 速度中等
└── 推荐:通用场景
2.4 布隆过滤器选择 #
text
布隆过滤器类型
├── NONE
│ └── 不使用布隆过滤器
│
├── ROW
│ ├── 行级布隆过滤器
│ ├── 根据RowKey过滤
│ └── 推荐:根据RowKey查询
│
└── ROWCOL
├── 行列级布隆过滤器
├── 根据RowKey+Column过滤
├── 内存占用更大
└── 推荐:根据RowKey+Column查询
三、预分区 #
3.1 预分区的重要性 #
text
预分区优势
├── 避免初始Region切分
├── 数据均匀分布
├── 提高写入性能
└── 避免热点问题
3.2 预分区方式 #
方式一:指定分区点 #
ruby
# 指定分区点
create 'user', 'info', SPLITS => ['10', '20', '30', '40']
# 分区结果
# Region 1: [, 10)
# Region 2: [10, 20)
# Region 3: [20, 30)
# Region 4: [30, 40)
# Region 5: [40, )
方式二:分区文件 #
ruby
# 创建分区文件 splits.txt
# 内容:
# 10
# 20
# 30
# 40
# 使用分区文件
create 'user', 'info', SPLITS_FILE => '/path/to/splits.txt'
方式三:自动分区算法 #
ruby
# HexStringSplit算法(16进制字符串分区)
create 'user', 'info', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
# UniformSplit算法(均匀分区)
create 'user', 'info', {NUMREGIONS => 10, SPLITALGO => 'UniformSplit'}
# DecimalStringSplit算法(十进制字符串分区)
create 'user', 'info', {NUMREGIONS => 10, SPLITALGO => 'DecimalStringSplit'}
3.4 预分区示例 #
ruby
# 用户表预分区(按用户ID前缀)
create 'user', 'info', SPLITS => ['1', '2', '3', '4', '5', '6', '7', '8', '9']
# 订单表预分区(按时间)
create 'order', 'detail', SPLITS => [
'202401', '202402', '202403', '202404',
'202405', '202406', '202407', '202408',
'202409', '202410', '202411', '202412'
]
# 日志表预分区(16进制)
create 'log', 'data', {NUMREGIONS => 16, SPLITALGO => 'HexStringSplit'}
四、命名空间 #
4.1 在命名空间中创建表 #
ruby
# 创建命名空间
create_namespace 'myapp'
# 在命名空间中创建表
create 'myapp:user', 'info'
# 带属性的命名空间
create_namespace 'myapp', {'owner' => 'admin', 'purpose' => 'production'}
4.2 命名空间操作 #
ruby
# 列出命名空间
list_namespace
# 查看命名空间详情
describe_namespace 'myapp'
# 列出命名空间中的表
list_namespace_tables 'myapp'
# 删除命名空间(必须为空)
drop_namespace 'myapp'
五、表属性配置 #
5.1 表级属性 #
ruby
# 设置表属性
create 'user', 'info',
CONFIGURATION => {'hbase.hregion.max.filesize' => '10737418240'}
# 只读表
create 'config', 'data', READONLY => true
# 正常表
create 'user', 'info', NORMALIZATION_ENABLED => true
5.2 常用表属性 #
| 属性 | 说明 |
|---|---|
| MAX_FILESIZE | Region最大大小 |
| READONLY | 是否只读 |
| NORMALIZATION_ENABLED | 是否启用Region自动调整 |
| REGION_REPLICATION | Region副本数 |
六、创建表示例 #
6.1 用户表 #
ruby
# 用户信息表
# RowKey: 用户ID反转
# 列族: info(基本信息), settings(设置)
create 'user',
{NAME => 'i', VERSIONS => 1, BLOOMFILTER => 'ROW'},
{NAME => 's', VERSIONS => 1},
SPLITS => ['1', '2', '3', '4', '5', '6', '7', '8', '9']
6.2 订单表 #
ruby
# 订单表
# RowKey: 用户ID_时间戳倒序
# 列族: d(详情), i(商品)
create 'order',
{NAME => 'd', VERSIONS => 1},
{NAME => 'i', VERSIONS => 1, COMPRESSION => 'SNAPPY'},
SPLITS => ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']
6.3 日志表 #
ruby
# 日志表
# RowKey: 设备ID_时间戳倒序
# 列族: d(数据)
create 'device_log',
{NAME => 'd', VERSIONS => 1, COMPRESSION => 'SNAPPY', TTL => 604800},
{NUMREGIONS => 32, SPLITALGO => 'HexStringSplit'}
6.4 时序数据表 #
ruby
# 时序数据表
# RowKey: 指标ID_时间戳倒序
# 列族: v(值)
create 'metrics',
{NAME => 'v', VERSIONS => 1, COMPRESSION => 'LZ4', TTL => 2592000},
{NUMREGIONS => 16, SPLITALGO => 'HexStringSplit'}
七、验证创建 #
7.1 查看表列表 #
ruby
# 列出所有表
list
# 列出命名空间中的表
list 'myapp:.*'
# 使用正则过滤
list /user.*/
7.2 查看表结构 #
ruby
# 查看表结构
describe 'user'
# 简洁格式
describe 'user', 'SIMPLE'
# 输出示例
Table user is ENABLED
user
COLUMN FAMILIES DESCRIPTION
{NAME => 'info', BLOOMFILTER => 'ROW', VERSIONS => '3', ...}
7.3 检查表状态 #
ruby
# 检查表是否存在
exists 'user'
# 检查表是否启用
is_enabled 'user'
# 检查表是否禁用
is_disabled 'user'
八、常见问题 #
8.1 表已存在 #
ruby
# 错误:Table already exists
# 解决:先删除或使用不同表名
disable 'user'
drop 'user'
create 'user', 'info'
8.2 列族名称过长 #
ruby
# 建议:列族名称控制在1-3个字符
# 好的命名
create 'user', 'i', 's', 'h'
# 不好的命名
create 'user', 'information', 'settings', 'history'
8.3 Region数量过多 #
ruby
# 问题:预分区过多,Region数量过大
# 解决:合理规划Region数量
# 计算:Region数 = 预估数据量 / Region大小
# 示例:100GB数据,10GB/Region → 10个Region
九、最佳实践 #
9.1 列族设计 #
text
列族设计建议
├── 列族数量:1-3个
├── 列族名称:简短(1-3字符)
├── 访问模式:经常一起访问的列放在同一列族
└── 数据类型:不同类型数据考虑分列族
9.2 预分区规划 #
text
预分区规划
├── 根据数据量估算Region数量
├── 根据RowKey分布设计分区点
├── 预分区点应覆盖数据分布范围
└── 避免分区过多或过少
9.3 压缩选择 #
text
压缩选择建议
├── 实时读写:SNAPPY 或 LZ4
├── 存储敏感:GZ 或 ZSTD
├── 平衡场景:LZO 或 ZSTD
└── 冷数据:GZ
十、总结 #
本节介绍了HBase创建表:
| 内容 | 要点 |
|---|---|
| 基本语法 | create ‘表名’, ‘列族’ |
| 列族属性 | VERSIONS、TTL、COMPRESSION、BLOOMFILTER等 |
| 预分区 | SPLITS、SPLITS_FILE、NUMREGIONS |
| 命名空间 | create_namespace、限定表名 |
| 表属性 | MAX_FILESIZE、READONLY等 |
下一步,让我们学习修改表!
最后更新:2026-03-27