前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Hive创建表时添加中文注释后乱码问题

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

作者头像
Dlimeng
发布2023-06-29 10:43:49
发布2023-06-29 10:43:49
9991
举报
文章被收录于专栏:开源心路开源心路

创建数据表时我们经验会添加一些中文注释到表里面方便识别,最近在测试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. 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; 

所以第二种方法就是修改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.  `COMMENT` varchar(256) CHARACTER SET utf8 DEFAULT NULL, 
  5. 修改表注释字符集: 
  6. 565行 
  7. `PARAM_VALUE` varchar(4000) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL, 
  8. 修改成: 
  9. `PARAM_VALUE` varchar(4000) CHARACTER SET utf8 DEFAULT NULL, 
  10. 修改分区注释字符集: 
  11. 249行: 
  12. `PKEY_COMMENT` varchar(4000) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL, 
  13. 修改成: 
  14. `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'; 

参考:http://blog.csdn.net/fenghuibian/article/details/53257579

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-04-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档