一、問題
在創建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;
成功解決!