Hive中文乱码问题:
在做实战时发现存在中文乱码问题:
为什么会乱码:
普通情况下咱们的mysql默认编码是latin1,但是我们在日常开发中大多数情况下需要用到utf-8编码,如果是默认latin1的话,咱们的中文存储进去容易乱码,所以说大家在遇到一些数据乱码的情况话,最好把mysql的编码改成utf-8.
注意一点::hive的元数据metastore在mysql的数据库,不管是数据库本身,还是里面的表编码都必须是latin1(CHARACTER SET latin1 COLLATE latin1_bin)!!!
验证方式:
mysql> show create database hive_cz3q;
在创建表的时候
create external table cars(
province string comment ‘省’,
month int comment ‘月’,
city string comment ‘市’,
district string comment ‘区县’
)
row format delimited fields terminated by ‘\t’;
在创建表的时候,字段可以有 comment,但是 comment 建议不要用中文说明,因为我们说过,hive 的 metastore 支持的字符集是 latin1,所以中文写入的时候会有编码问题
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%”;
这样在启动hive,向hive中插入的表中comment等有汉字的情况,就可以正常的显示
在线安装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%';
进入数据库 MySQL中执行以下 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;
修改MySQL的连接 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>
验证:
改好后,用一个表和数据导入后面查看一下,select*from 表名 查看一些是否还是乱码
或者 desc 表名,查看一些表的结构,看看有没有改成utf-8格式
以上我的表的,大家如果要改的话,要改成自己的表字段和分区字段的,还有数据库的名字和端口号的
以上我的表的,大家如果要改的话,要改成自己的表字段和分区字段的,还有数据库的名字和端口号的
最后一种情况是:
你传入的表是csv,但是他和格式和txt不一样,你可以把.csv的文件后缀名改成.txt
也可以在notepad或者其他笔记软件改一下文件编码格式就行,不要去改数据库也可以读取,不会出现乱码
一般先试试这个,这个不行就改数据库文件的编码格式。