创建数据表时我们经验会添加一些中文注释到表里面方便识别,最近在测试Hive的时候,发现添在Hive创建表时添加COMMENT时的中文注释就会出现乱码,如下:
 
 
  
 
 
  解压思路:
  
 
  
1、查看存放Hive元数据信息的数据库表字符集;是否因为字符集问题
- mysql> show create table COLUMNS_V2\G
 - *************************** 1. row ***************************
 - Table: COLUMNS_V2
 - Create Table: CREATE TABLE `COLUMNS_V2` (
 - `CD_ID` bigint(20) NOT NULL,
 - `COMMENT` varchar(256) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
 - `COLUMN_NAME` varchar(767) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
 - `TYPE_NAME` varchar(4000) DEFAULT NULL,
 - `INTEGER_IDX` int(11) NOT NULL,
 - PRIMARY KEY (`CD_ID`,`COLUMN_NAME`),
 - KEY `COLUMNS_V2_N49` (`CD_ID`),
 - CONSTRAINT `COLUMNS_V2_FK1` FOREIGN KEY (`CD_ID`) REFERENCES `CDS` (`CD_ID`)
 - ) ENGINE=InnoDB DEFAULT CHARSET=latin1
 - 1 row in set (0.00 sec)
 
可以看出,由于表使用的是默认的latin1字符集,所以中文显示不出来,应该使用utf8;
 
 
  
但是很奇怪,我整个MySQL都是使用utf8的字符集;所以这个与Mysql的配置无直接关系;但是可以通过修改Mysql上面的表默认字符集来解决,这个是不需要修改Hive配置的方法,快捷方便,不影响现有数据。
登陆Mysql数据库切换到Hive库:
- use hive
 
修改以下两张表即可;
- 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;
 
再回到Hive查看表结构时就正常显示中文了;
如果你的表创建了分区的话就要再加一条语句:
- alter table PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;
 
所以第二种方法就是修改hive默认的SQL语句来实现;
1、通过关键字查找文件
- find /home/otouser/software/hive |xargs grep -ri "latin1" -l
 
通过上面命令可以看到很多文件:不过明确目录就在:
- hive/scripts/metastore/upgrade/mysql 下
 
2、根据你使用的hive版本来修改:【修改一个文件即可】
进入目录:
- cd hive/scripts/metastore/upgrade/mysql
 
因为我使用的hive是2.0.0版本,所以就修改这个文件:hive-schema-2.0.0.mysql.sql
只需修改以下几步:其实就是跟上面的一样;
修改字段注释字符集:
- 54行
 - `COMMENT` varchar(256) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
 - 修改成:
 - `COMMENT` varchar(256) CHARACTER SET utf8 DEFAULT NULL,
 - 修改表注释字符集:
 - 565行
 - `PARAM_VALUE` varchar(4000) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
 - 修改成:
 - `PARAM_VALUE` varchar(4000) CHARACTER SET utf8 DEFAULT NULL,
 - 修改分区注释字符集:
 - 249行:
 - `PKEY_COMMENT` varchar(4000) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
 - 修改成:
 - `PKEY_COMMENT` varchar(4000) CHARACTER SET utf8 DEFAULT NULL,
 
最后修改完后就执行上面的初始化元数据,再创建表时就可以看到正常显示中文了。
   
   
实例中使用的建表语句:
- DROP TABLE IF EXISTS tao12;
 - create table tao12
 - (class string COMMENT '品类',
 - product string COMMENT '商品名称',
 - price double COMMENT '市场价',
 - valence double COMMENT '双十二价',
 - discount string COMMENT '折扣力度',
 - choose string COMMENT '推荐理由')
 - ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
 - LINES TERMINATED BY '\n';
 










