问题解决:hive建表之后存在中文注释乱码的问题
问题场景
为了后面的维护同事方便,一般都会要求同事在写hive
建表语句的时候,都需要添加相关的注释,包括字段注释和表注释。而一般都是直接为中文注释的。如下是一个比较完整的hive
建表语句:
CREATE EXTERNAL TABLE `test`(
S_NO string COMMENT '序号',
I_TYPE int COMMENT '类别')
COMMENT '测试表'
PARTITIONED BY (
`day` int)
LOCATION '/TMP/test';
所以这里就出现问题了,写好比较完整的hive
建表脚本之后,执行之后,去查看表的建表结构,发现存在乱码
问题环境
软件 | 版本 |
---|---|
CDH | 5.15.1 |
hive | 1.1.0-cdh5.15.1 |
问题原因
其实hive
的元数据都是存储在数据库里面,目前支持mysql
,oracle
,Postgres
和MS SQL Server
。如果我们建表发现乱码,很显然就可以归类到数据库表乱码问题。本例关联的数据库是mysql
。
那么,在hive
关联的mysql
数据库里面,会涉及哪些表呢?整体可以看下图:
另外,我整理了一下,常用的表如下:
表名 | 说明 | 关联键 |
---|---|---|
TBLS | 所有hive表的基本信息(表名,创建时间,所属者等) | TBL_ID,SD_ID |
TABLE_PARAM | 表级属性(如是否外部表,表注释,最后修改时间等) | TBL_ID |
COLUMNS | Hive表字段信息(字段注释,字段名,字段类型,字段序号) | SD_ID |
SDS | 所有hive表、表分区所对应的hdfs数据目录和数据格式 | SD_ID,SERDE_ID |
SERDE_PARAM | 序列化反序列化信息,如行分隔符、列分隔符、NULL的表示字符等 | SERDE_ID |
PARTITIONS | Hive表分区信息(所属表,分区值) | PART_ID,SD_ID,TBL_ID |
PARTITION_KEYS | Hive分区表分区键(即分区字段) | TBL_ID |
PARTITION_KEY_VALS | Hive表分区名(键值) | PART_ID |
INDEX_PARAMS | 索引的字段信息 | INDEX_ID |
解决方案
在mysql
对应的hive
库执行以下SQL
,即可更新回来:
-- 修改表字段注解和表注解
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;
结果
重新建表之后,然后使用命令show create table test
可以查看到注释已经正常了。
总结
查找问题是怎么产生的,并解决掉。这个过程可能会比较枯燥和繁琐,不过收获还是蛮大的!
参考链接
Hive Home
Hive UserDocumentation
hive-mysql的关系(Hive集成Mysql作为元数据)
Hive(三)Hive元数据信息对应MySQL数据库表
随缘求赞
如果我的文章对大家产生了帮忙,可以在文章底部点个赞或者收藏;
如果有好的讨论,可以留言;
如果想继续查看我以后的文章,可以左上角点击关注