Hive创建表时添加中文注释后乱码问题


创建数据表时我们经验会添加一些中文注释到表里面方便识别,最近在测试hive的时候,发现添在Hive创建表时添加COMMENT时的中文注释就会出现乱码,如下:

解压思路:

1、查看存放Hive元数据信息的数据库表字符集;是否因为字符集问题

  1. mysql> show create table COLUMNS_V2\G 
  2. *************************** 1. row *************************** 
  3.        Table: COLUMNS_V2 
  4. Create Table: CREATE TABLE `COLUMNS_V2` ( 
  5.   `CD_ID` bigint(20) NOT NULL, 
  6.   `COMMENT` varchar(256) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL, 
  7.   `COLUMN_NAME` varchar(767) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL, 
  8.   `TYPE_NAME` varchar(4000) DEFAULT NULL, 
  9.   `INTEGER_IDX` int(11) NOT NULL, 
  10.   PRIMARY KEY (`CD_ID`,`COLUMN_NAME`), 
  11.   KEY `COLUMNS_V2_N49` (`CD_ID`), 
  12.   CONSTRAINT `COLUMNS_V2_FK1` FOREIGN KEY (`CD_ID`) REFERENCES `CDS` (`CD_ID`) 
  13. ENGINE=InnoDB DEFAULT CHARSET=latin1 
  14. 1 row in set (0.00 sec) 

可以看出,由于表使用的是默认的latin1字符集,所以中文显示不出来,应该使用utf8;

但是很奇怪,我整个Mysql都是使用utf8的字符集;所以这个与Mysql的配置无直接关系;但是可以通过修改Mysql上面的表默认字符集来解决,这个是不需要修改Hive配置的方法,快捷方便,不影响现有数据。

 

解决方法一:建议使用此方法

登陆Mysql数据库切换到Hive库:

  1. use hive 

修改以下两张表即可;

  1. alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8; 
  2.  
  3. alter table TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8; 


再回到Hive查看表结构时就正常显示中文了;

如果你的表创建了分区的话就要再加一条语句:

  1. alter table PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8; 

 

方法二:【适合未初始化元数据时操作】

使用Mysql作为Hive的元数据存储方式时都要使用命令,初始化才可以使用:

  1. ./schematool -dbType mysql -initSchema 

所以通过上面这个命令,就知道既然要初始化,就等于先执行一下默认的SQL语句去建表。【不然hive中的表哪来?】

 

所以第二种方法就是修改hive默认的SQL语句来实现;

1、通过关键字查找文件

  1. find /home/otouser/software/hive |xargs grep -ri "latin1" -l 

通过上面命令可以看到很多文件:不过明确目录就在:

  1. hive/scripts/metastore/upgrade/mysql 下 

2、根据你使用的hive版本来修改:【修改一个文件即可】

进入目录:

  1. cd hive/scripts/metastore/upgrade/mysql 

因为我使用的hive是2.0.0版本,所以就修改这个文件:hive-schema-2.0.0.mysql.sql 

只需修改以下几步:其实就是跟上面的一样;

修改字段注释字符集: 

  1.  54行   
  2.  `COMMENT` varchar(256) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL, 
  3. 修改成: 
  4.  
  5.  `COMMENT` varchar(256) CHARACTER SET utf8 DEFAULT NULL, 
  6.  
  7. 修改表注释字符集: 
  8.  
  9. 565行 
  10. `PARAM_VALUE` varchar(4000) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL, 
  11. 修改成: 
  12. `PARAM_VALUE` varchar(4000) CHARACTER SET utf8 DEFAULT NULL, 
  13.  
  14.  
  15. 修改分区注释字符集: 
  16.  
  17. 249行: 
  18. `PKEY_COMMENT` varchar(4000) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL, 
  19.  
  20. 修改成: 
  21. `PKEY_COMMENT` varchar(4000) CHARACTER SET utf8 DEFAULT NULL, 

最后修改完后就执行上面的初始化元数据,再创建表时就可以看到正常显示中文了。

 

实例中使用的建表语句:

  1. DROP TABLE IF EXISTS tao12; 
  2. create table tao12 
  3. (class string COMMENT '品类', 
  4. product string COMMENT '商品名称', 
  5. price double COMMENT '市场价', 
  6. valence  double COMMENT '双十二价', 
  7. discount string COMMENT '折扣力度', 
  8. choose string COMMENT '推荐理由') 
  9. ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 
  10. LINES TERMINATED BY '\n';