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命令),再重新创建视图。再次执行查询,会发现中文已经可以正常显示了。