hive乱码主要分为三种:
- 一种是hive cli查询乱码,但是在ambari端查看正常;
- 一种是导入汉字数据后,所有客户端方式查询都乱码;
- 一种是hive cli查询没有乱码,但是通过jdbc或者hiveserver2查询出现了乱码。
下面分别列出亲测可行的解决方案:
第一种:hive cli查询乱码,但是在ambari端查看正常
表现:在hive基础命令行下后查询时,中文出现乱码,但是ambari控制台界面显示正常。
原因:数据是正常的,但是使用hive命令行的ssh工具的编码问题
解决方案:把xshell,putty之类的远程终端的编码修改为UTF-8 ,然后重新连接即可。
第二种:导入包含汉字的文本数据后,hive查询出现乱码
表现:导入包含中文的文本数据后,使用hive cli及hiveserver2查询数据时,中文部分均出现乱码。
原因:编码不一致的问题,hive默认使用utf-8编码,导入的中文文本数据需要保证也是utf-8格式。
解决方案:首先在linux或者macos终端下,使用file 文件名 查看文本编码格式是不是utf-8。如果不是就需要改为utf-8,修改文本编码格式有两种常用方式:
- 使用一些常用文本工具,比如editplus,notepad++ 打开这个包含中文的文件,并修改它的编码格式为utf-8,保存即可;
- 在linux或者macOS终端下,使用vim编辑器修改,首先vim 文件名打开文件,然后在控制台输入
:set fileencoding=utf-8
,然后:wq
保存退出即可。
第三种:hive cli查询没有乱码,但是通过jdbc或者hiveserver2查询出现了乱码。
表现:导入utf-8格式的文本数据后,基础的hive cli查询没有乱码,presto查询hive也没有出现乱码,但是hiveserver2查询却出现了乱码。
原因:这是由于hive-env.sh里面没有配置编码格式,导致hiveserver2查询出中文后,输出的格式发生了变化,导致了乱码。
解决方案:首先在在hive-env.sh
文件的最后加上编码格式:
export HADOOP_OPTS="$HADOOP_OPTS -Dfile.encoding=UTF-8"
然后重启hiveserver2
bin/hiveserver2 restart
最后连接hiveserver2测试即可
/bin/beeline -u jdbc:hive2://localhost:10000