Hive中创建视图出现中文乱码问题及解决方法

2021-11-29 15:36:41.0

问题描述

我有一个Hive表,在其上创建了一个视图。然后查询视图,结果发现视图中的中文列值全显示为?(问号)。

问题原因

虽然Hive元数据库编码设置为utf8,但是TBLS表的定义却有自己的编码。我们登录Hive的元数据库MySQL,打开数据库hive,查看TBLS表的create table语句:

   mysql> show create table TBLS;

结果显示如下所示:

CREATE TABLE `TBLS` (
  `TBL_ID` bigint(20) NOT NULL,
  `CREATE_TIME` int(11) NOT NULL,
  `DB_ID` bigint(20) DEFAULT NULL,
  `LAST_ACCESS_TIME` int(11) NOT NULL,
  `OWNER` varchar(767) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `RETENTION` int(11) NOT NULL,
  `SD_ID` bigint(20) DEFAULT NULL,
  `TBL_NAME` varchar(128) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `TBL_TYPE` varchar(128) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
  `VIEW_EXPANDED_TEXT` mediumtext,
  `VIEW_ORIGINAL_TEXT` mediumtext,
  PRIMARY KEY (`TBL_ID`),
  UNIQUE KEY `UNIQUETABLE` (`TBL_NAME`,`DB_ID`),
  KEY `TBLS_N50` (`SD_ID`),
  KEY `TBLS_N49` (`DB_ID`),
  CONSTRAINT `TBLS_FK1` FOREIGN KEY (`SD_ID`) REFERENCES `SDS` (`SD_ID`),
  CONSTRAINT `TBLS_FK2` FOREIGN KEY (`DB_ID`) REFERENCES `DBS` (`DB_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

可以看到,表的默认编码为latin1。因此当在视图中有中文时,就会出现乱码。

解决方法

既然乱码是因为编码问题,那么我们在MySQL中执行下面的两句修改命令,将编码修改为utf8就可以了。

mysql> ALTER TABLE `TBLS` MODIFY COLUMN VIEW_EXPANDED_TEXT mediumtext CHARACTER SET utf8;
mysql> ALTER TABLE `TBLS` MODIFY COLUMN VIEW_ORIGINAL_TEXT mediumtext CHARACTER SET utf8;

把之前建立的视图删除(使用drop view命令),再重新创建视图。再次执行查询,会发现中文已经可以正常显示了。


《PySpark原理深入与编程实战》