Hive创建表时添加COMMENT时的中文注释就会出现乱码,如下:
创建表:
CREATE TABLE dws_vip_efective_total_year (row_key string,
vip_market_id int COMMENT '开通付费会员的商场ID',
vip_market_name string COMMENT '开通付费会员的商场名称',
vip_efective_total int COMMENT '有效付费会员人数',
summary_time string COMMENT '当前属于第几年',
create_time string COMMENT '创建时间',
update_time string COMMENT '更新时间')COMMENT '付费会员有效人数-年'
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES
("hbase.columns.mapping" = ":key,info:vip_market_id,info:vip_market_name,
info:vip_efective_total,info:summary_time,info:create_time,info:update_time")
TBLPROPERTIES ("hbase.table.name" = "hopsonone:dws_vip_efective_total_day");
解决思路:
进入mysql中查看编码规则:
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 utf8 DEFAULT NULL,
`COLUMN_NAME` varchar(767) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
`TYPE_NAME` mediumtext,
`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
可以看出,由于表使用的是默认的latin1字符集,所以中文显示不出来,应该使用utf8;
一、那么我们只需要把相应注释的地方的字符集由 latin1 改成 utf-8,就可以了。用到注释的就三个地方,表、分区、视图,这个是不需要修改Hive配置的方法,快捷方便,不影响现有数据。(但是很奇怪,我整个Mysql都是使用utf8的字符集;所以这个与Mysql的配置无直接关系)
登陆Mysql数据库切换到Hive库:
1、进入数据库 Metastore 中执行以下 5 条 SQL 语句
use hive
(1)修改表字段注解和表注解
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;
(2)修改分区字段注解
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;
(3)修改索引注解
alter table INDEX_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
2、修改 metastore 的连接 URL(注:不做这一步也可以)
修改hive-site.xml配置文件
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://IP:3306/hive_metastore?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=UTF-8</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
二、使用Mysql作为Hive的元数据存储方式时都要使用命令,初始化才可以使用:
(这个方法没有试过,推荐使用第一种方法)
./schematool -dbType mysql -initSchema
所以通过上面这个命令,就知道既然要初始化,就等于先执行一下默认的SQL语句去建表。【不然hive中的表哪来?】
所以第二种方法就是修改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,
最后修改完后就执行上面的初始化元数据,再创建表时就可以看到正常显示中文了。