@[toc]
出现原因
一般 Hive 的元数据信息都存储在 MySQL 中,但 MySQL 数据库中的 character_set_server
和 character_set_database
参数,默认都为 latin1
字符集,这两个参数决定了服务器和数据库如何处理和存储数据的字符编码,而我们通常使用的字符集都是 utf8
,所以会造成 Hive 中注释出现 ????
乱码的情况。
可以通过下面的命令在 MySQL 进行检查:
-- 获取 MySQL 与字符集和校对规则相关的配置变量列表
show variables like "colla%";
-- 获取 MySQL 字符集变量列表
show variables like 'chara%';
MySQL 字符集修改
修改 MySQL 配置文件:
vim /etc/my.cnf
添加下列内容:
# 在 [mysqld] 标签下加入
character-set-server=utf8
collation-server=utf8_general_ci
## 在末尾加入
[client]
default-character-set=utf8
添加完成后重新启动 MySQL 服务:
systemctl restart mysqld
调整元数据库字符集
进入 MySQL 中调整下列参数,切换到存储 Hive 元数据信息的库,然后执行。
-- 进入存储 Hive 元数据信息的库
use hive;
-- 修改表字段注释和表注释
alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
alter table TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
-- 修改分区字段注释
alter table PARTITION_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
alter table PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;
-- 修改索引注释
alter table INDEX_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
注意,仅对修改后创建的新表生效!
测试
在 Hive 中创建一个新表,并添加注释信息。
DROP TABLE IF EXISTS sku_info;
CREATE TABLE sku_info(
`sku_id` string COMMENT '商品id',
`name` string COMMENT '商品名称',
`category_id` string COMMENT '所属分类id',
`from_date` string COMMENT '上架日期',
`price` double COMMENT '商品单价'
) COMMENT '商品属性表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
问题解决。