解决hive建表中文乱码问题
问题:

关于中文乱码问题,我们可以从以下几个方面进行考虑:
(1)判断hive表的存储格式是否是utf-8:
- 如果hive表的存储格式不是utf-8,也会导致中文乱码。
(2)判断输入的数据,其编码格式是否是中文字符集utf-8:
- hive默认使用utf-8编码,如果输入的中文字符集与utf-8不一致,就会出现乱码。
- 比如通过jdbc的方式连接,其是否设置了编码格式为utf-8
(3)判断hive的所依赖的mysql元数据库的编码格式是否是utf-8
- 因为为了提高读写速度,不用依次去读hive的hdfs文件,所以一般依赖元数据库都是mysql。
- 所以需要判断hive元数据库mysql中是否设置了编码格式
1、修改hive元数据库的编码格式,这里以元数据库为mysql为例
1.1 进入 etc目录下打开 my.cnf 文件 ,对 my.cnf 添加以下语句:
[client] default-character-set=utf8 [mysqld] default-storage-engine=innodb character-set-server=utf8 collation-server=utf8_general_ci
完成之后,重启mysql,再进入到mysql查看修改是否成功

1.2 在 mysql 修改hive元数据表注释和字段注释的编码为 utf-8
(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;
- 修改分区字段注解
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;
(2)也可在数据库可视化工具(例如dbeaver)设置columns_v2 、table_params 、partition_params 、partition_keys 的编码格式为utf-8

2、在 hive 的配置文件 hive-site.xml 中
我们可以通过指定字符集编码来解决中文乱码问题。
以下是一个示例:
<property>
<name>javax.jdo.option.connectionurl</name>
<value>jdbc:mysql://localhost:3306/metastore?createdatabaseifnotexist=true&useunicode=true&characterencoding=utf-8</value>
<description>database username for metastore</description>
</property>在这个示例中,我们通过设置 useunicode=true 和 characterencoding=utf-8 来指定使用 utf-8 字符集编码。
此外,在 hive-site.xml 配置文件中,也可以通过以下两个参数来指定字符集编码:
<property> <name>hive.cli.print.header</name> <value>true</value> <description>whether to print the names of the columns in query output.</description> </property> <property> <name>hive.cli.encoding</name> <value>utf-8</value> <description>character-set encoding for various cli output data such as console output, logs, reports.</description> </property> <property> <name>hive.charset</name> <value>utf8</value> <description>the character set encoding to use for data read/write operations.</description> </property>
在这个示例中,我们通过设置 hive.cli.encoding 参数的值为 utf-8 来指定字符集编码。这个参数可用于指定各种 cli 输出数据的字符集编码,例如控制台输出、日志和报告等。
需要注意的是,在进行配置时,建议采用统一的字符集编码,以确保所有代码能够正常工作。
结果展示:

3、直接在建表语句中设置字符集,但这不一定能生效
当hive建表字段注释中出现中文乱码时,可能是因为字符集编码不匹配所导致的。我们可以在建表语句中指定字符集编码来解决这个问题。以下是一个示例:
create table mytable ( id int comment '编号', name string comment '姓名' ) comment '学生信息表' row format delimited fields terminated by '\t' stored as textfile tblproperties ( 'serialization.null.format' = '', 'charset'='utf8', -- 指定字符集编码为utf-8 'orc.compress'='snappy' );
在这个示例中,我们在建表语句中加入了 'charset'='utf8' 参数,来指定字符集编码为 utf-8。
这样就能确保 hive 能够正确地解析中文字符,从而避免乱码问题。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论