問題場景
爲了後面的維護同事方便,一般都會要求同事在寫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
,Postgres
和MS 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數據庫表
隨緣求贊
如果我的文章對大家產生了幫忙,可以在文章底部點個贊或者收藏;
如果有好的討論,可以留言;
如果想繼續查看我以後的文章,可以左上角點擊關注