1、问题产生的原因
作者使用的cdh版本是6.2.0,hive版本是2.1.0,原因是hive查询orc格式的varchar字段的时候没有指定编码,使用了默认编码,默认的编码不是utf-8引起的,具体可以参考这篇大佬源码追踪的文章,链接是:hive中文字段乱码排查
2、解决方法
2.1 hive on mapreduce解决
其实上面的链接有大佬给出的解决方法,有挺多的,可以重新打包,不过比较简单和推荐的还是直接在cm界面修改一下配置文件,指定am,maptask和reducetask的运行编码格式
在后面加上: -Dfile.encoding=utf-8 就可以了
2.2 hive on spark的解决
思路是一样的,就是指定作业的运行编码为utf-8,避免使用默认编码就行。
在cm的管理界面,进到spark的配置,搜索spark- 找到高级代码客户端配置 spark-default.conf,文本框输以下配置:
spark.executor.extraJavaOptions=-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8
spark.driver.extraJavaOptions=-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8