hive中文漢字亂碼終極解決辦法

一、問題

在創建hive表時,comment要加中文註釋,比如:

drop table if exists users;
create table users(
name string comment '姓名',
age int comment '年齡'
);

執行後再show create table users;
在這裏插入圖片描述

二、別人的解決方法

中國文化博大精深,無奈沒有成爲世界統一標準,根據一般人的經驗,腦中一定是utf8哪個地方沒設置好的問題,經過一番百度,找到 如下解決方法,在hive的mysql元數據庫中執行:

alter database hive character set latin1;
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;

再到hive中重新創建表後執行show create table users;無奈還是亂碼!依然沒解決! 百度不是解決根本問題的方法!

三、問題分析

儘管上面的方法修改了元數據的編碼格式,我們查看下hive的mysql元數據表COLUMNS_V2
在這裏插入圖片描述
依然是亂碼。。。
分析:客戶端通過jdbc方式連接hive執行sql,sql提交給hiveserver2執行,hiveserver2再告訴hivemetastore要創建表,於是hivemetastore負責跟mysql打交道,它倆直接打交道也通過jdbc,注意,客戶端與hiveserver2,hivemetastore跟mysql,雖然都是jdbc,但是驅動是不一樣的,我們應該關注的是hivemetastore跟mysql交互過程中的utf8編碼沒設置。so ,問題已分析完

四、解決方法

上面的元數據修改sql執行後,在hive-site.xml裏面的mysql jdbc配置中

<property>
     <name>javax.jdo.option.ConnectionURL</name>
     <value>jdbc:mysql://recessw-hdp3-manager001:3306/hive?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=UTF-8</value>
</property>

重要的是加上useUnicode=true&characterEncoding=UTF-8。再次創建表後執行show create table users;
在這裏插入圖片描述
成功解決!

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