个人初始开发环境的基本情况以及Hive元数据库说明
hive的元数据库改成了mysql(安装完mysql之后也没有进行其它别的设置)
hive-site.xml中设置元数据库对应的配置为
jdbc:mysql://ip:3306/metastore?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;
+-----------+-----------------------------------------------------------------------------------------+ |
不然会有类似如下的错误:
那么怎么修改mysql的编码为utf8呢?这里提供了在线安装修改和离线方式安装下的修改方式供大家选择!
乱码的情况:
向hive的表中 创建表,表语句部分如下:
create table ods.ods_order |
在创建表的时候,字段可以有 comment,但是 comment 建议不要用中文说明,因为我们说过,hive 的 metastore 支持的字符集是 latin1,所以中文写入的时候会有编码问题,如下图!
然后通过desc ods_order 查看 对应的comment中是中文的地方,通过Xshell显示全部都是 “?” 问号. 同时确认了Xshell支持显示中文(排除Xshell的问题).
以上就是说Hive在字段定义时的Comment中文乱码问题.
有了上述的问题,那么我们该如何去解决注释中文乱码问题呢?
解决方式
首先进行Mysql的编码设置
离线安装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'2020/03/09更新:
default-character-set=utf8
,如果这样改会导致5.7版本mysql无法打开所以要改为character-set-server=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月开始实施。
在线安装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 mysql restart
和离线方式一样验证编码是否确实修改;
show variables like 'char%';
针对元数据库metastore中的表,分区,视图的编码设置
因为我们知道 metastore 支持数据库级别,表级别的字符集是 latin1,那么我们只需要把相应注释的地方的字符集由 latin1 改成 utf-8
,就可以了。用到注释的就三个地方,表、分区、视图。如下修改分为两个步骤:
进入数据库 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;
- 修改表字段注解和表注解
修改 metastore 的连接 URL
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://IP:3306/db_name?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=UTF-8</value>
</property>
测试结果:
以上就能完美的解决这个问题.
其他
有时候在使用xml作为配置文件的时候,应该要使用xml的编码规则来进行适当的设置。如&
在xml文件中应该写为&
下面给出xml中一些特殊符号的编码转换:
代码 | 符号 | 描述 |
---|---|---|
< |
< | 小于号 |
> |
> | 大于号 |
& |
& | and字符 |
' |
‘ | 单引号 |
" |
“ | 双引号 |