1. 程式人生 > >hive中文字符亂碼 解決方法【轉】

hive中文字符亂碼 解決方法【轉】

為我 如果 mysql blog res mys shake 如何 color

一.個人初始開發環境的基本情況以及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&amp;useUnicode=true&characterEncoding=UTF-8</value>
    <description>JDBC connect string for a JDBC metastore</description>
</property>

測試結果:

技術分享圖片

以上就能完美的解決這個問題.

hive中文字符亂碼 解決方法【轉】