hive mysql 中文乱码问题研究。

本文介绍如何将MySQL和Hive配置为使用UTF-8字符集,并解决了因此产生的元数据表字段长度限制问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先mysql 字符集修改
1:[client] 下面增加:
default-character-set = utf8
2:[mysqld]下面增加:
character-set-server = utf8
3:[mysql] 下面增加:
default-character-set = utf8


4:重启mysql数据库:service mysqld restart


5:hive-site.xml配置文件中指定utf-8:
<property>
  <name>javax.jdo.option.ConnectionURL</name>
  <value>jdbc:mysql://IP:3306/hive?createDatabaseIfNotExist=true&amp;characterEncoding=UTF-8</value>
  <description>JDBC connect string for a JDBC metastore</description>
</property>


6:启动hive,执行show tables;
第一次执行hive会创建相关元数据库表,此时会报错,具体原因是package.jdo中定义的字段太长,因为默认是按照latin1编码的长度,utf8编码的话要长度缩小3倍。
latin1编码的index和pk字段都有长度限制最大为767,utf8的话最大只能设置255了。所以就有下一步操作


7:修改hive-metastore-0.10.0-cdh4.2.2.jar中的package.jdo文件,将index和pk字段的长度大于255的字段定义都改小,默认是缩小3倍把。比如原文件定义的是256,那么改成85.


然后把修改好的jar包替换掉HIVE_HOME/lib目录下的hive-metastore-0.10.0-cdh4.2.2.jar。


8:删除mysql中的hive元数据库,drop database hive; 删除hdfs上的 /user/hive目录和/tmp/hive-hadoop目录(如果有的话)


9:重新运行hive命令,执行show tables;重新创建元数据库表。此时应该能够创建成功,不会报哪个超过767长度的错误了。


10:测试一下load中文分区:
create table userinfo(id int ,name string,age int) partitioned by (province string) row format delimited fields terminated by '\t';


load data local inpath '/home/hadoop/hive_example_data/province_jx.txt' overwrite into table userinfo partition (province='上海');


select * from userinfo;
查询结果能够正常显示中文的分区。


但是show partitions userinfo;显示的分区还是乱码,没解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值