HBase 关键字及大小写问题,中文的十六进制编码

关键字可以不加引号


这是HBase Shell中的一个语法规则。


一、为什么 METHOD 不需要引号?

因为 METHOD 是 HBase Shell 的 关键字**,不是字符串。**

text

复制代码
HBase Shell 底层是 Ruby 语言环境
Ruby 中,有些单词被识别为符号(Symbol),写法是 :method 或 method

在 HBase Shell 中:
- METHOD 被当作符号处理
- 不加引号也能识别
- 也可以加引号,两种都支持

二、两种写法都正确

bash

复制代码
# 写法1:不加引号(推荐,HBase官方文档写法)
alter_namespace 'a2608', {METHOD => 'set', 'date_time' => '20260529'}

# 写法2:加引号(也正确)
alter_namespace 'a2608', {'METHOD' => 'set', 'date_time' => '20260529'}

# 写法3:使用符号(Ruby语法)
alter_namespace 'a2608', {:METHOD => 'set', 'date_time' => '20260529'}

三、HBase Shell 中常见的关键字(可加可不加引号)

关键字 说明 使用场景
METHOD 指定操作方法 {METHOD => 'set'}
NAME 指定列簇名称 {NAME => 'info'}
VERSIONS 设置版本数 {NAME => 'info', VERSIONS => 3}
COMPRESSION 设置压缩算法 {NAME => 'info', COMPRESSION => 'SNAPPY'}
TTL 设置数据存活时间 {NAME => 'info', TTL => 2592000}
BLOOMFILTER 设置布隆过滤器 {NAME => 'info', BLOOMFILTER => 'ROW'}
REPLICATION_SCOPE 设置复制范围 {NAME => 'info', REPLICATION_SCOPE => 1}
KEEP_DELETED_CELLS 是否保留删除的单元格 {NAME => 'info', KEEP_DELETED_CELLS => true}
BLOCKCACHE 是否开启块缓存 {NAME => 'info', BLOCKCACHE => true}
BLOCKSIZE 设置块大小 {NAME => 'info', BLOCKSIZE => 65536}

四、必须加引号的情况

用户自定义的字符串(属性名、表名、列簇名、值)必须加引号

bash

复制代码
# ✅ 正确:用户自定义的内容加引号
alter_namespace 'a2608', {METHOD => 'set', 'date_time' => '20260529'}
#                                            ↑           ↑
#                                     用户自定义属性名  用户自定义值

# ✅ 正确:建表时列簇名加引号
create 'student', 'info', 'score'
#                 ↑      ↑
#              用户定义的列簇名

# ❌ 错误:用户自定义内容不加引号
alter_namespace 'a2608', {METHOD => 'set', date_time => 20260529}
#                                            ↑ 报错!

五、总结对照表

内容类型 是否需要引号 示例
关键字(METHOD, NAME, VERSIONS...) ❌ 不需要(也可以加) METHOD => 'set'
命名空间名 ✅ 必须加 'a2608'
表名 ✅ 必须加 'student'
列簇名 ✅ 必须加 'info'
列限定符 ✅ 必须加 'name'
属性名(用户自定义) ✅ 必须加 'date_time'
属性值(用户自定义) ✅ 必须加 '20260529'

六、快速判断技巧

text

复制代码
问自己:这个单词是 HBase 命令本身定义的,还是我自己起的名字?

- HBase 定义的(关键字)→ 可以不加引号
- 我自己起的(表名、列簇名、属性名)→ 必须加引号

例子:

bash

复制代码
# METHOD = HBase定义的关键字 → 可以不加引号
# 'set' = 用户写的值 → 必须加引号
# 'date_time' = 用户自定义的属性名 → 必须加引号
# '20260529' = 用户自定义的值 → 必须加引号

alter_namespace 'a2608', {METHOD => 'set', 'date_time' => '20260529'}

这个规则同样适用于 altercreatedescribe 等命令的列簇属性设置:

bash

复制代码
# 修改列簇属性
alter 'student', {NAME => 'info', VERSIONS => 5, TTL => 2592000}
#                 ↑           ↑           ↑
#              关键字      关键字       关键字(都不加引号)

关键字不一定需要大写,但强烈建议大写!


一、HBase Shell 关键字的写法规则

HBase Shell 底层是 Ruby 环境 ,关键字不区分大小写 ,但官方文档和实际使用中习惯大写

bash

复制代码
# 以下三种写法都正确,都能执行

# 1. 大写(官方推荐)
alter_namespace 'a2608', {METHOD => 'set', 'date_time' => '20260529'}

# 2. 小写(也能执行)
alter_namespace 'a2608', {method => 'set', 'date_time' => '20260529'}

# 3. 大小写混合(也能执行)
alter_namespace 'a2608', {Method => 'set', 'date_time' => '20260529'}

二、为什么建议大写?

原因 说明
官方规范 HBase 官方文档、示例代码都用大写
可读性强 一眼就能区分"关键字"和"用户自定义内容"
行业惯例 所有 HBase 使用者都这么写,便于交流
避免混淆 关键字大写,自己的内容加引号,清晰明了

三、示例对比

bash

复制代码
# 推荐写法(关键字大写,用户内容加引号)
alter 'student', {NAME => 'info', VERSIONS => 3, TTL => 2592000}
create 'student', 'info', 'score'
alter_namespace 'a2608', {METHOD => 'set', 'author' => 'jinqiu'}

# 不推荐(虽然能执行,但看着乱)
alter 'student', {name => 'info', versions => 3, ttl => 2592000}
alter_namespace 'a2608', {method => 'set', 'author' => 'jinqiu'}

四、常见关键字写法对照

关键字 大写(推荐) 小写(也可以) 说明
METHOD METHOD method 操作方法
NAME NAME name 列簇名称
VERSIONS VERSIONS versions 版本数
TTL TTL ttl 存活时间
COMPRESSION COMPRESSION compression 压缩算法
BLOOMFILTER BLOOMFILTER bloomfilter 布隆过滤器
REPLICATION_SCOPE REPLICATION_SCOPE replication_scope 复制范围
KEEP_DELETED_CELLS KEEP_DELETED_CELLS keep_deleted_cells 保留删除单元格
BLOCKCACHE BLOCKCACHE blockcache 块缓存

五、总结

text

复制代码
规则:关键字不区分大小写
建议:全部大写

为什么?
  一是官方这么写
  二是看着清晰
  三是大家都懂

简单记:关键字大写 + 用户内容引号 = 标准写法

bash

复制代码
标准写法示例:
{NAME => 'info', VERSIONS => 3, METHOD => 'set'}
  ↑            ↑      ↑           ↑
大写         引号    大写        引号

中文的十六进制编码


不是乱码,这是中文的十六进制编码显示。


一、这是什么?

text

复制代码
value=\xE6\xB5\x8B\xE8\xAF\x95\xE6\x95\xB0\xE6\x8D\xAE

这是 "测试数据" 四个字的 UTF-8 编码,每个中文占3个字节:

字节序列 对应的字
\xE6\xB5\x8B
\xE8\xAF\x95
\xE6\x95\xB0
\xE6\x8D\xAE

二、为什么会这样显示?

HBase 存储的是字节数组,不是字符串。

  • HBase 不关心你存的是什么类型(文字、图片、序列化对象...)

  • 它只管存字节

  • 显示时,能显示成字符的就显示字符

  • 显示不了的(或编码问题)就显示十六进制 \xXX


三、如何正常显示中文?

方法1:查询时指定编码(推荐)

bash

复制代码
get 'a2608:student', '001', {FORMATTER => 'toString'}

方法2:扫描时指定编码

bash

复制代码
scan 'a2608:student', {FORMATTER => 'toString'}

方法3:使用 cat 命令(Linux环境)

bash

复制代码
echo "get 'a2608:student', '001'" | hbase shell | grep -v '^Took'

方法4:查看单个值

bash

复制代码
get 'a2608:student', '001', 'info:name'

四、你现在试试

bash

复制代码
# 正常显示中文
get 'a2608:student', '001', {FORMATTER => 'toString'}

预期输出:

text

复制代码
COLUMN                         CELL
 info:age                      timestamp=..., value=20
 info:name                     timestamp=..., value=测试数据

五、为什么 age 显示正常,name 显示乱码?

数据 存储内容 显示结果
20 数字(ASCII) 直接显示 20
测试数据 中文(UTF-8多字节) 显示十六进制

结论: 你的数据没问题,存进去的就是"测试数据",只是显示方式问题。

bash

复制代码
# 验证数据是否正确(导出到文件看)
echo "get 'a2608:student', '001', 'info:name'" | hbase shell > /tmp/result.txt
cat /tmp/result.txt

六、永久解决(修改HBase配置)

让HBase默认显示字符串而不是十六进制:

bash

复制代码
# 编辑 HBase 配置文件
vim $HBASE_HOME/conf/hbase-site.xml

# 添加以下配置
<property>
  <name>hbase.display.encoding</name>
  <value>UTF-8</value>
</property>

需要重启HBase生效。


简单记忆: {FORMATTER => 'toString'} 加在查询后面就能正常看中文了。

相关推荐
BAGAE5 天前
星链卫星数据获取:从太空安全到实时通信的技术革命
网络·数据结构·数据库·算法·云计算·hbase
JAVA面经实录9179 天前
HBase 知识点梳理(文档型 NoSQL)
大数据·数据库·nosql数据库·hbase
大大大大晴天11 天前
Flink-HBase生产问题排查:NoClassDefFoundError
flink·hbase
大大大大晴天️11 天前
Flink-HBase生产问题排查:NoClassDefFoundError
大数据·flink·hbase
muddjsv16 天前
HBase与Hadoop:基于什么开发?深度剖析与架构图
数据库·hadoop·hbase
muddjsv16 天前
HBase 与 Hadoop 安装与上手使用全指导
数据库·hadoop·hbase
段一凡-华北理工大学17 天前
工业领域的Hadoop架构学习~系列文章09:HBase列式数据库
数据库·人工智能·hadoop·架构·hbase·高炉炼铁·高炉炼铁智能化
muddjsv17 天前
Hadoop 与 HBase 深度剖析:从架构原理到实战应用
hadoop·架构·hbase
Irene199118 天前
(AI总结版)Docker + HBase 安装全过程总结(WSL2 + Win11)
docker·hbase
Irene199118 天前
Win11 安装 Docker Desktop 并配置 WSL 使用 Hbase
docker·hbase