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