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'} 加在查询后面就能正常看中文了。

相关推荐
Irene19913 小时前
WSL 环境中安装 HBase(前置条件 Hadoop 已安装并正在运行)
hbase
头歌实践平台4 小时前
HBase 完全分布式安装(新)
数据库·分布式·hbase
Irene19916 小时前
(课堂笔记)HBase(分布式、面向列的 NoSQL 数据库)基础
hbase
Irene19916 小时前
HBase 典型应用场景与阿里实践
hbase
大帅点兵1 天前
设计一个金融交易监控系统
大数据·clickhouse·flink·spark·kafka·hbase
abcy0712131 天前
HBase Region数据恢复详解
hbase
abcy0712131 天前
RegionServer 自动重启原因详解
hbase
r-t-H6 天前
从零开始搭建CDH-第十二章
linux·hive·spark·centos·hbase
阿坤带你走近大数据7 天前
Hbase的基本概念,基本用法及常见使用场景
大数据·数据库·hbase