Hbase的使用

1️⃣ 创建表 (Create)

HBase 建表时必须指定 表名 和至少一个 列族

  • 语法 : create '表名', '列族名'
  • 注意 : 列族名通常以小写字母结尾(如 cf, info, data)。

示例 : 创建一个名为 user_table 的表,包含两个列族:info (基本信息) 和 stats (统计数据)。

ruby

编辑

复制代码
create 'user_table', 'info', 'stats'

验证表是否创建成功:

ruby

编辑

复制代码
list
# 输出应包含 'user_table'

describe 'user_table'
# 查看表的详细结构

2️⃣ 插入/修改数据 (Put / Update)

在 HBase 中,插入 (Insert)更新 (Update) 是同一个命令:put

如果 RowKey 不存在,则插入;如果存在,则覆盖旧值(新版本会保留历史版本,默认保留3个版本)。

  • 语法 : put '表名', 'RowKey', '列族:列限定符', '值'
  • 核心 : 数据是通过 RowKey + 列族:列 唯一确定的。

示例 : 向 user_table 插入数据。

ruby

编辑

复制代码
# 插入用户 ID 为 '1001' 的基本信息
put 'user_table', '1001', 'info:name', 'Alice'
put 'user_table', '1001', 'info:age', '25'
put 'user_table', '1001', 'info:email', 'alice@example.com'

# 插入用户 ID 为 '1001' 的统计数据 (同一个 RowKey,不同列族)
put 'user_table', '1001', 'stats:login_count', '150'
put 'user_table', '1001', 'stats:last_login', '2026-03-10'

# 【更新操作】修改 Alice 的年龄 (直接再次 put 即可)
put 'user_table', '1001', 'info:age', '26'

3️⃣ 查询数据 (Read)

HBase 有三种主要查询方式:

A. 根据 RowKey 查单行 (get)

最快、最高效的查询方式。

ruby

编辑

复制代码
# 查整行
get 'user_table', '1001'

# 只查特定列族
get 'user_table', '1001', 'info'

# 只查特定列
get 'user_table', '1001', 'info:name'
B. 全表扫描 (scan)

类似 SQL 的 SELECT *,会遍历所有数据(大数据量时慎用)。

ruby

编辑

复制代码
# 扫描全表
scan 'user_table'

# 带条件扫描 (例如只扫描 RowKey 以 '10' 开头的)
scan 'user_table', {STARTROW => '10', ENDROW => '11'}
C. 统计行数 (count)

ruby

编辑

复制代码
count 'user_table'

4️⃣ 删除数据 (Delete)

HBase 的删除分为三个层级:

A. 删除某个单元格 (Cell) 的值

ruby

编辑

复制代码
# 删除 '1001' 用户的 email
delete 'user_table', '1001', 'info:email'
B. 删除整行 (Row)

ruby

编辑

复制代码
# 删除 '1001' 这一整行数据(包括 info 和 stats 下的所有列)
deleteall 'user_table', '1001'
C. 删除整张表

⚠️ 注意 : 删除表前必须先 禁用 (disable) 它。

ruby

编辑

复制代码
# 1. 禁用表
disable 'user_table'

# 2. 删除表
drop 'user_table'

# (如果想恢复,可以用 create 重新建,但数据没了)

📊 综合实战案例

假设我们要管理一个简单的图书系统:

ruby

编辑

复制代码
# 1. 建表:books 表,列族为 'meta' (元数据) 和 'content' (内容)
create 'books', 'meta', 'content'

# 2. 插入数据
put 'books', 'isbn_001', 'meta:title', 'HBase权威指南'
put 'books', 'isbn_001', 'meta:author', 'Lars George'
put 'books', 'isbn_001', 'content:chapter1', 'Introduction to NoSQL'

put 'books', 'isbn_002', 'meta:title', '大数据时代'
put 'books', 'isbn_002', 'meta:author', 'Viktor Mayer'

# 3. 查询
get 'books', 'isbn_001'              # 查第一本书
scan 'books', {COLUMNS => 'meta:title'} # 只查所有书的标题

# 4. 更新 (再版了,作者变了)
put 'books', 'isbn_001', 'meta:author', 'Lars George & Others'

# 5. 删除某本书
deleteall 'books', 'isbn_002'

# 6. 清理环境
disable 'books'
drop 'books'

💡 重要提示 (Best Practices)

  1. RowKey 设计是核心 : HBase 的性能极度依赖 RowKey 的设计。

    • ❌ 避免单调递增的 RowKey(如时间戳、自增ID),这会导致所有写入都集中在最后一个 RegionServer(热点写问题)。
    • ✅ 推荐加盐 (Salt)、哈希 (Hash) 或反转字符串来打散数据。
  2. 列族不要太多: 一张表建议 1~3 个列族,太多会影响 Flush 和 Compaction 性能。

  3. 版本控制 : HBase 默认保存 3 个版本的数据。如果不需要历史版本,建表时可以设置 VERSIONS => 1 以节省空间。ruby

    编辑

    复制代码
    create 'my_table', {NAME => 'cf', VERSIONS => 1}
相关推荐
淹死在鱼塘的程序猿10 分钟前
🚀 告别"一次性聊天":揭秘让 AI 智能体越用越聪明的秘密武器 —— Skills
前端·人工智能·agent
掘金安东尼14 分钟前
OpenMUSE 全面详解:非扩散Transformer文生图开源基座(对标GPT Image 2)
前端·javascript·面试
下次再写16 分钟前
Java互联网大厂面试技术问答实战:涵盖Java SE、Spring Boot、微服务及多场景应用
java·数据库·缓存·面试·springboot·microservices·技术问答
公众号-老炮说Java18 分钟前
IDEA 2026.1 + Claude Code = 降维打击
java·ide·intellij-idea
~ rainbow~23 分钟前
前端转型全栈(六)——深入浅出:文件上传的原理与进阶
前端·http·文件上传
千寻girling23 分钟前
RabbitMQ 详细教程(38K字数)
java·后端·面试
止语Lab31 分钟前
Go vs Java GC:同一场延迟战争的两条路
java·开发语言·golang
卷毛的技术笔记38 分钟前
从“拆东墙补西墙”到“最终一致”:分布式事务在Spring Boot/Cloud中的破局之道
java·spring boot·分布式·后端·spring cloud·面试·rocketmq
我就是马云飞42 分钟前
我废了!大厂10年的我面了20家公司,面试官让我回去等通知!
android·前端·程序员
ERBU DISH44 分钟前
修改表字段属性,SQL总结
java·数据库·sql