关键字可以不加引号
这是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'}
这个规则同样适用于 alter、create、describe 等命令的列簇属性设置:
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'} 加在查询后面就能正常看中文了。