問題解決:hive建表之後存在中文註釋亂碼的問題

問題場景

爲了後面的維護同事方便,一般都會要求同事在寫hive建表語句的時候,都需要添加相關的註釋,包括字段註釋和表註釋。而一般都是直接爲中文註釋的。如下是一個比較完整的hive建表語句:

CREATE EXTERNAL TABLE `test`(
	S_NO string COMMENT '序號',
	I_TYPE int COMMENT '類別')
COMMENT '測試表'
PARTITIONED BY ( 
  `day` int)
LOCATION '/TMP/test';

所以這裏就出現問題了,寫好比較完整的hive建表腳本之後,執行之後,去查看錶的建表結構,發現存在亂碼
大家都在發

問題環境

軟件 版本
CDH 5.15.1
hive 1.1.0-cdh5.15.1

問題原因

其實hive的元數據都是存儲在數據庫裏面,目前支持mysql,oracle,PostgresMS SQL Server。如果我們建表發現亂碼,很顯然就可以歸類到數據庫表亂碼問題。本例關聯的數據庫是mysql
在這裏插入圖片描述
那麼,在hive關聯的mysql數據庫裏面,會涉及哪些表呢?整體可以看下圖:
在這裏插入圖片描述
另外,我整理了一下,常用的表如下:

表名 說明 關聯鍵
TBLS 所有hive表的基本信息(表名,創建時間,所屬者等) TBL_ID,SD_ID
TABLE_PARAM 表級屬性(如是否外部表,表註釋,最後修改時間等) TBL_ID
COLUMNS Hive表字段信息(字段註釋,字段名,字段類型,字段序號) SD_ID
SDS 所有hive表、表分區所對應的hdfs數據目錄和數據格式 SD_ID,SERDE_ID
SERDE_PARAM 序列化反序列化信息,如行分隔符、列分隔符、NULL的表示字符等 SERDE_ID
PARTITIONS Hive表分區信息(所屬表,分區值) PART_ID,SD_ID,TBL_ID
PARTITION_KEYS Hive分區表分區鍵(即分區字段) TBL_ID
PARTITION_KEY_VALS Hive表分區名(鍵值) PART_ID
INDEX_PARAMS 索引的字段信息 INDEX_ID

解決方案

mysql對應的hive庫執行以下SQL,即可更新回來:

-- 修改表字段註解和表註解
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;
-- 修改分區字段註解:
alter table PARTITION_PARAMS  modify column PARAM_VALUE varchar(4000) character set utf8;
alter table PARTITION_KEYS  modify column PKEY_COMMENT varchar(4000) character set utf8;
-- 修改索引註解:
alter table  INDEX_PARAMS  modify column PARAM_VALUE  varchar(4000) character set utf8;

結果

重新建表之後,然後使用命令show create table test可以查看到註釋已經正常了。

總結

查找問題是怎麼產生的,並解決掉。這個過程可能會比較枯燥和繁瑣,不過收穫還是蠻大的!
在這裏插入圖片描述

參考鏈接

Hive Home
Hive UserDocumentation
hive-mysql的關係(Hive集成Mysql作爲元數據)
Hive(三)Hive元數據信息對應MySQL數據庫表

隨緣求贊

如果我的文章對大家產生了幫忙,可以在文章底部點個贊或者收藏;
如果有好的討論,可以留言;
如果想繼續查看我以後的文章,可以左上角點擊關注

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章