天天看點

Hive建立表時添加中文注釋後亂碼問題

建立資料表時我們經驗會添加一些中文注釋到表裡面友善識别,最近在測試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. `PARAM_VALUE` varchar(4000) CHARACTER SET utf8 DEFAULT NULL, 
  9. 修改分區注釋字元集: 
  10. 249行: 
  11. `PKEY_COMMENT` varchar(4000) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL, 
  12. `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';