文章目录
- 问题场景
- 问题环境
- 问题原因
- 解决方案
- 结果
- 总结
- 参考链接
- 随缘求赞
问题场景
为了后面的维护同事方便,一般都会要求同事在写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
可以查看到注释已经正常了。
总结
查找问题是怎么产生的,并解决掉。这个过程可能会比较枯燥和繁琐,不过收获还是蛮大的!