hive中文字符乱码 解决方法【转】
一.個(gè)人初始開發(fā)環(huán)境的基本情況以及Hive元數(shù)據(jù)庫(kù)說明
①hive的元數(shù)據(jù)庫(kù)改成了mysql(安裝完mysql之后也沒有進(jìn)行其它別的設(shè)置)
②hive-site.xml中設(shè)置元數(shù)據(jù)庫(kù)對(duì)應(yīng)的配置為 ?jdbc:mysql://crxy99:3306/hive_cz3q?createDatabaseIfNotExist=true
③普通情況下咱們的mysql默認(rèn)編碼是latin1,但是我們?cè)谌粘i_發(fā)中大多數(shù)情況下需要用到utf-8編碼,如果是默認(rèn)latin1的話,咱們的中文存儲(chǔ)進(jìn)去容易亂碼,所以說大家在遇到一些數(shù)據(jù)亂碼的情況話,最好把mysql的編碼改成utf-8.
但是在這里要非常嚴(yán)重強(qiáng)調(diào)的一點(diǎn):hive的元數(shù)據(jù)metastore在mysql的數(shù)據(jù)庫(kù),不管是數(shù)據(jù)庫(kù)本身,還是里面的表編碼都必須是latin1(CHARACTER SET latin1 COLLATE latin1_bin)!!!!!
驗(yàn)證方式:(可以通過客戶端軟件在數(shù)據(jù)庫(kù)上右鍵屬性查看,也可以通過命令查看)
mysql> show create database hive_cz3q;
+-----------+-----------------------------------------------------------------------------------------+ | Database | Create Database | +-----------+-----------------------------------------------------------------------------------------+ | hive_cz3q | CREATE DATABASE `hive_cz3q` /*!40100 DEFAULT CHARACTER SET latin1 COLLATE latin1_bin */ | +-----------+-----------------------------------------------------------------------------------------+不然會(huì)有類似如下的錯(cuò)誤:
?
那么怎么修改mysql的編碼為utf8呢?這里提供了在線安裝修改和離線方式安裝下的修改方式供大家選擇!
二.亂碼的情況:
?向hive的表中 創(chuàng)建表,表語句部分如下:
create table ods.ods_order (ORDER_ID int comment '訂單ID',ORDER_NO varchar(30) comment '訂單編號(hào)(唯一字段),前綴字符表示訂單來源:a,Andriod;b,微博;c,WEB;e,餓了么;i,Iphone;m,Mobile;x,微信; z,中糧我買網(wǎng);l,其它。 接著3位數(shù)字代表訂單城市編號(hào);接著字符z與后面的真正訂單編號(hào)分隔。這套機(jī)制從2014年12月開始實(shí)施。',DEALER_ID int comment '門店ID',CUST_ID int comment '客戶ID',**********
在創(chuàng)建表的時(shí)候,字段可以有 comment,但是 comment 建議不要用中文說明,因?yàn)槲覀冋f過,hive 的 metastore 支持的字符集是 latin1,所以中文寫入的時(shí)候會(huì)有編碼問題,如下圖!?
然后通過desc ods_order 查看 對(duì)應(yīng)的comment中是中文的地方,通過Xshell顯示全部都是 "?" 問號(hào). ?同時(shí)確認(rèn)了Xshell支持顯示中文(排除Xshell的問題).
以上就是說Hive在字段定義時(shí)的Comment中文亂碼問題.
有了上述的問題,那么我們?cè)撊绾稳ソ鉀Q注釋中文亂碼問題呢??
三.解決方式:
1.首先進(jìn)行Mysql的編碼設(shè)置
(1)離線安裝mysql的修改方式:
①修改編碼,設(shè)置為utf8
拷貝 mysql 的配置文件/usr/share/mysql/my-small.cnf 到/etc/my.cnf?
在mysql 配置文件/etc/my.cnf 中增加以下內(nèi)容
[client]下面增加 default-character-set=utf8 在[mysqld]下面增加 default-character-set=utf8 init_connect='SET NAMES utf8'?②重啟mysql 服務(wù)(這樣確保缺省編碼是utf8)
service mysqld restart③驗(yàn)證編碼是否改成了utf8:
輸入命令 "\s"
輸入命令:show variables like 'char%'
輸入命令:show variables like "colla%";
?
OK修改成功!
④這樣在啟動(dòng)hive,向hive中插入的表中comment等有漢字的情況,就可以正常的顯示(如下為本人測(cè)試的部分顯示結(jié)果):
0: jdbc:hive2://localhost:10000/ods> desc ods_order; +--------------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------+--+ | col_name | data_type | comment | +--------------------------+-----------------------+---------------------------------------------------------------------------------------------------------------------------------------------+--+ | order_id | int | 訂單ID | | order_no | varchar(30) | 訂單編號(hào)(唯一字段),前綴字符表示訂單來源:a,Andriod;b,微博;c,WEB;e,餓了么;i,Iphone;m,Mobile;x,微信; z,中糧我買網(wǎng);l,其它。 接著3位數(shù)字代表訂單城市編號(hào);接著字符z與后面的真正訂單編號(hào)分隔。這套機(jī)制從2014年12月開始實(shí)施。?
(2)在線安裝mysql的修改方式
?①修改編碼,設(shè)置為utf-8
?在 mysql 配置文件/etc/my.cnf(不需要拷貝)中[mysqld]的下面增加以下內(nèi)容
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服務(wù)
service mysqld restart?
③ 和離線方式一樣驗(yàn)證編碼是否確實(shí)修改;
show variables like 'char%';??
?2.針對(duì)元數(shù)據(jù)庫(kù)metastore中的表,分區(qū),視圖的編碼設(shè)置
因?yàn)槲覀冎?metastore?支持?jǐn)?shù)據(jù)庫(kù)級(jí)別,表級(jí)別的字符集是?latin1,那么我們只需要把相應(yīng)注釋的地方的字符集由?latin1?改成?utf-8,就可以了。用到注釋的就三個(gè)地方,表、分區(qū)、視圖。如下修改分為兩個(gè)步驟:
?(1)、進(jìn)入數(shù)據(jù)庫(kù)?Metastore?中執(zhí)行以下?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
②?修改分區(qū)字段注解:
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>?
測(cè)試結(jié)果:
?
以上就能完美的解決這個(gè)問題.
?
| 作者:SummerChill 出處:http://www.cnblogs.com/DreamDrive/ 本博客為自己總結(jié)亦或在網(wǎng)上發(fā)現(xiàn)的技術(shù)博文的轉(zhuǎn)載。 如果文中有什么錯(cuò)誤,歡迎指出。以免更多的人被誤導(dǎo)。 | ? |
轉(zhuǎn)載于:https://www.cnblogs.com/byfboke/p/10025833.html
總結(jié)
以上是生活随笔為你收集整理的hive中文字符乱码 解决方法【转】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用SQL语句更改数据库名,表名,列名
- 下一篇: struts2--java.lang.I