一.個人初始開發環境的基本情況以及Hive元數據庫說明
①hive的元數據庫改成了mysql(安裝完mysql之后也沒有進行其它別的設置)
②hive-site.xml中設置元數據庫對應的配置為 jdbc:mysql://crxy99:3306/hive_cz3q?createDatabaseIfNotExist=true
③普通情況下咱們的mysql默認編碼是latin1,但是我們在日常開發中大多數情況下需要用到utf-8編碼,如果是默認latin1的話,咱們的中文存儲進去容易亂碼,所以說大家在遇到一些數據亂碼的情況話,最好把mysql的編碼改成utf-8.
但是在這里要非常嚴重強調的一點:hive的元數據metastore在mysql的數據庫,不管是數據庫本身,還是里面的表編碼都必須是latin1(CHARACTER SET latin1 COLLATE latin1_bin)!!!!!
驗證方式:(可以通過客戶端軟件在數據庫上右鍵屬性查看,也可以通過命令查看)
mysql> show create database hive_cz3q;
+-----------+-----------------------------------------------------------------------------------------+ | Database | Create Database | +-----------+-----------------------------------------------------------------------------------------+ | hive_cz3q | CREATE DATABASE `hive_cz3q` /*!40100 DEFAULT CHARACTER SET latin1 COLLATE latin1_bin */ | +-----------+-----------------------------------------------------------------------------------------+
不然會有類似如下的錯誤:
那么怎么修改mysql的編碼為utf8呢?這里提供了在線安裝修改和離線方式安裝下的修改方式供大家選擇!
二.亂碼的情況:
向hive的表中 創建表,表語句部分如下:
create table ods.ods_order ( ORDER_ID int comment '訂單ID', ORDER_NO varchar(30) comment '訂單編號(唯一字段),前綴字符表示訂單來源:a,Andriod;b,微博;c,WEB;e,餓了么;i,Iphone;m,Mobile;x,微信; z,中糧我買網;l,其它。 接着3位數字代表訂單城市編號;接着字符z與后面的真正訂單編號分隔。這套機制從2014年12月開始實施。', DEALER_ID int comment '門店ID', CUST_ID int comment '客戶ID',
**********
在創建表的時候,字段可以有 comment,但是 comment 建議不要用中文說明,因為我們說過,hive 的 metastore 支持的字符集是 latin1,所以中文寫入的時候會有編碼問題,如下圖!
然后通過desc ods_order 查看 對應的comment中是中文的地方,通過Xshell顯示全部都是 "?" 問號. 同時確認了Xshell支持顯示中文(排除Xshell的問題).
以上就是說Hive在字段定義時的Comment中文亂碼問題.
有了上述的問題,那么我們該如何去解決注釋中文亂碼問題呢?
三.解決方式:
1.首先進行Mysql的編碼設置
(1)離線安裝mysql的修改方式:
①修改編碼,設置為utf8
拷貝 mysql 的配置文件/usr/share/mysql/my-small.cnf 到/etc/my.cnf
在mysql 配置文件/etc/my.cnf 中增加以下內容
[client]下面增加 default-character-set=utf8 在[mysqld]下面增加 default-character-set=utf8 init_connect='SET NAMES utf8'
②重啟mysql 服務(這樣確保缺省編碼是utf8)
service mysqld restart
③驗證編碼是否改成了utf8:
輸入命令 "\s"
輸入命令:show variables like 'char%'
輸入命令:show variables like "colla%";
OK修改成功!
④這樣在啟動hive,向hive中插入的表中comment等有漢字的情況,就可以正常的顯示(如下為本人測試的部分顯示結果):
0: jdbc:hive2://localhost:10000/ods> desc ods_order; +--------------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------+--+ | col_name | data_type | comment | +--------------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------+--+ | order_id | int | 訂單ID | | order_no | varchar(30) | 訂單編號(唯一字段),前綴字符表示訂單來源:a,Andriod;b,微博;c,WEB;e,餓了么;i,Iphone;m,Mobile;x,微信; z,中糧我買網;l,其它。 接着3位數字代表訂單城市編號;接着字符z與后面的真正訂單編號分隔。這套機制從2014年12月開始實施。
(2)在線安裝mysql的修改方式
①修改編碼,設置為utf-8
在 mysql 配置文件/etc/my.cnf(不需要拷貝)中[mysqld]的下面增加以下內容
init_connect='SET collation_connection = utf8_unicode_ci' init_connect='SET NAMES utf8' character-set-server=utf8 collation-server=utf8_unicode_ci skip-character-set-client-handshake
②重啟mysqld服務
service mysqld restart
③ 和離線方式一樣驗證編碼是否確實修改;
show variables like 'char%';
2.針對元數據庫metastore中的表,分區,視圖的編碼設置
因為我們知道 metastore 支持數據庫級別,表級別的字符集是 latin1,那么我們只需要把相應注釋的地方的字符集由 latin1 改成 utf-8,就可以了。用到注釋的就三個地方,表、分區、視圖。如下修改分為兩個步驟:
(1)、進入數據庫 Metastore 中執行以下 5 條 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;
(2)、修改 metastore 的連接 URL
<property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://IP:3306/db_name?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=UTF-8</value> <description>JDBC connect string for a JDBC metastore</description> </property>
測試結果:
以上就能完美的解決這個問題.