Hive中的字符集编码若干问题

个人初始开发环境的基本情况以及Hive元数据库说明

  1. hive的元数据库改成了mysql(安装完mysql之后也没有进行其它别的设置)

  2. hive-site.xml中设置元数据库对应的配置为 jdbc:mysql://ip:3306/metastore?createDatabaseIfNotExist=true

  3. 普通情况下咱们的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 */ |
+-----------+-----------------------------------------------------------------------------------------+

不然会有类似如下的错误:

图片1

那么怎么修改mysql的编码为utf8呢?这里提供了在线安装修改和离线方式安装下的修改方式供大家选择!

乱码的情况:

向hive的表中 创建表,表语句部分如下:

create table ods.ods_order
(
ORDER_ID int comment '订单ID',
ORDER_NO varchar(30) comment '订单编号(唯一字段),
DEALER_ID int comment '门店ID',
CUST_ID int comment '客户ID',

在创建表的时候,字段可以有 comment,但是 comment 建议不要用中文说明,因为我们说过,hive 的 metastore 支持的字符集是 latin1,所以中文写入的时候会有编码问题,如下图!

然后通过desc ods_order 查看 对应的comment中是中文的地方,通过Xshell显示全部都是 “?” 问号. 同时确认了Xshell支持显示中文(排除Xshell的问题).

以上就是说Hive在字段定义时的Comment中文乱码问题.

图片2

有了上述的问题,那么我们该如何去解决注释中文乱码问题呢?

解决方式

首先进行Mysql的编码设置

离线安装mysql的修改方式
  1. 修改编码,设置为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'

    2020/03/09更新default-character-set=utf8,如果这样改会导致5.7版本mysql无法打开所以要改为 character-set-server=utf8,(可选)改完后,要重新创建表才能使用。

  2. 重启mysql 服务(这样确保缺省编码是utf8)

    service mysqld restart
  3. 验证编码是否改成了utf8:

    输入命令 “\s”

    图片3

    输入命令:show variables like ‘char%’

    图片4

    输入命令:show variables like “colla%”;

    图片5

    OK修改成功!

  4. 这样在启动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与后面的真正订单编号分隔。这套机制从201412月开始实施。
在线安装mysql的修改方式
  1. 修改编码,设置为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

    图片6

  2. 重启mysqld服务

    service mysql restart
  3. 和离线方式一样验证编码是否确实修改;

    show variables like 'char%';

    图片7

针对元数据库metastore中的表,分区,视图的编码设置

因为我们知道 metastore 支持数据库级别,表级别的字符集是 latin1,那么我们只需要把相应注释的地方的字符集由 latin1 改成 utf-8,就可以了。用到注释的就三个地方,表、分区、视图。如下修改分为两个步骤:

  1. 进入数据库 Metastore 中执行以下 5 条 SQL 语句

    1. 修改表字段注解和表注解
      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
    2. 修改分区字段注解:
      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
    3. 修改索引注解:
      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&amp;characterEncoding=UTF-8</value>
    </property>

测试结果:

图片8

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

其他

有时候在使用xml作为配置文件的时候,应该要使用xml的编码规则来进行适当的设置。如&在xml文件中应该写为&amp;

下面给出xml中一些特殊符号的编码转换:

代码 符号 描述
&lt; < 小于号
&gt; > 大于号
&amp; & and字符
&apos; 单引号
&quot; 双引号
Author: Tunan
Link: http://yerias.github.io/2018/11/01/hive/1/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.