文章目录

  • 问题场景
  • 问题环境
  • 问题原因
  • 解决方案
  • 结果
  • 总结
  • 参考链接
  • 随缘求赞

问题场景

为了后面的维护同事方便,一般都会要求同事在写hive建表语句的时候,都需要添加相关的注释,包括字段注释和表注释。而一般都是直接为中文注释的。如下是一个比较完整的hive建表语句:

CREATE EXTERNAL TABLE `test`(
	S_NO string COMMENT '序号',
	I_TYPE int COMMENT '类别')
COMMENT '测试表'
PARTITIONED BY ( 
  `day` int)
LOCATION '/TMP/test';

所以这里就出现问题了,写好比较完整的hive建表脚本之后,执行之后,去查看表的建表结构,发现存在乱码

更改字段中文注释hive_字段

问题环境

软件

版本

CDH

5.15.1

hive

1.1.0-cdh5.15.1

问题原因

其实hive的元数据都是存储在数据库里面,目前支持mysql,oracle,PostgresMS SQL Server。如果我们建表发现乱码,很显然就可以归类到数据库表乱码问题。本例关联的数据库是mysql

更改字段中文注释hive_字段_02


那么,在hive关联的mysql数据库里面,会涉及哪些表呢?整体可以看下图:

更改字段中文注释hive_hive_03


另外,我整理了一下,常用的表如下:

表名

说明

关联键

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_Hive_04