Hive之中文亂碼問題

前言

  • Hive:2.3.0
  • Hadoop:2.7.7
  • MySQL Server:5.7.10
  • OS:CentOS 7
  • 本文主要演示如何解決Hive註釋內容(即COMMENT)中出現中文亂碼的問題

原因

Hive中的表字段等註釋信息都存儲在元數據庫metastore中(本文中的元數據存儲在MySQL的hive_db數據庫中),當使用desc命令查看錶字段的註釋信息時,Hive會直接讀取元數據庫中的hive_db.COLUMNS_V2表,同樣的修改元數據庫中此表中的內容會直接反饋到desc的查詢結果中。故,之所以desc查詢結果中顯示中文亂碼,是因爲元數據庫中對應表中的元數據字符集無法顯示中文(默認爲latin1),因此本文主要是通過修改元數據庫中的字符集來解決中文亂碼的問題。


解決步驟

1)連接存儲元數據的數據庫(此處爲MySQL中的hive_db),執行下列SQL語句

-- 注意選擇對應的元數據存儲數據庫
use hive_db;
-- 修改表字段註釋字符集
ALTER TABLE COLUMNS_V2 MODIFY COLUMN `COMMENT` varchar(256) CHARACTER SET utf8;
-- 修改表字段名字符集
ALTER TABLE COLUMNS_V2 MODIFY COLUMN `COLUMN_NAME` varchar(767) CHARACTER SET utf8;

-- 修改表屬性Key和Value字符集
ALTER TABLE TABLE_PARAMS MODIFY COLUMN `PARAM_VALUE` varchar(4000) CHARACTER SET utf8;
ALTER TABLE TABLE_PARAMS MODIFY COLUMN `PARAM_KEY` varchar(256) CHARACTER SET utf8;

-- 修改分區屬性Key和Value字符集
ALTER TABLE PARTITION_PARAMS MODIFY COLUMN `PARAM_KEY` varchar(256) CHARACTER SET utf8;
ALTER TABLE PARTITION_PARAMS MODIFY COLUMN `PARAM_VALUE` varchar(4000) CHARACTER SET utf8;
-- 修改分區字段Key和Value字符集
ALTER TABLE PARTITION_KEYS MODIFY COLUMN `PKEY_COMMENT` varchar(4000) CHARACTER SET utf8;
ALTER TABLE PARTITION_KEY_VALS MODIFY COLUMN `PART_KEY_VAL` varchar(256) CHARACTER SET utf8;
-- 修改分區的分區名字符集
ALTER TABLE `PARTITIONS` MODIFY COLUMN `PART_NAME` varchar(767) CHARACTER SET utf8;

-- 修改索引屬性Key和Value字符集
ALTER TABLE INDEX_PARAMS MODIFY COLUMN `PARAM_KEY` varchar(256) CHARACTER SET utf8;
ALTER TABLE INDEX_PARAMS MODIFY COLUMN `PARAM_VALUE` varchar(4000) CHARACTER SET utf8;

2)修改metastore的連接url

修改hive-site.xml文件中對應配置

    <!-- JDBC連接MySQL設置,其中MySQL安裝在hadoop101上,MySQL通信端口爲3306,
        存儲Hive metadata的數據庫名爲hive_db, 如果不存在對應數據庫則進行創建
		即createDatabaseIfNotExist=true-->
    <!-- 默認值:jdbc:derby:;databaseName=metastore_db;create=true -->
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://hadoop101:3306/hive_db?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=UTF-8</value>
        <description>
            JDBC connect string for a JDBC metastore.
            To use SSL to encrypt/authenticate the connection, provide database-specific SSL flag in the connection URL.
            For example, jdbc:postgresql://myhost/db?ssl=true for postgres database.
        </description>
    </property>

3)重新建表即可

PS:修改編碼之前的註釋依舊是亂碼,只有修改編碼之後創建的註釋纔不會亂碼


參考資料

Hive學習之路 (八)Hive中文亂碼

hive修改使用utf8編碼支持中文字符集

hive中解決中文亂碼


End~

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