问题解决: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,PostgresMS 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数据库表

随缘求赞

如果我的文章对大家产生了帮忙,可以在文章底部点个赞或者收藏;
如果有好的讨论,可以留言;
如果想继续查看我以后的文章,可以左上角点击关注

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章