建立資料表時我們經驗會添加一些中文注釋到表裡面友善識别,最近在測試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';