Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员
查看: 12|回复: 0

hive元数据存储到mysql后因字符集原因导致的中文乱码解决方法

[复制链接]
  • TA的每日心情
    奋斗
    昨天 19:16
  • 签到天数: 66 天

    [LV.6]常住居民II

    1348

    主题

    1348

    帖子

    3万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32858
    发表于 2021-6-9 10:46:09 | 显示全部楼层 |阅读模式

    一.个人初始开发环境的基本情况以及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 中执行以下 条 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>

     

    测试结果: 

     

    以上就能完美的解决这个问题.

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2021-6-22 22:45 , Processed in 0.059224 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表