使用spark-sql执行sql语句重定向输出结果至文件是正常的。但是不适用大批量数据的导出。
使用insert overwrite的方式导出数据时发现结果文件乱码。
原因
排除了spark操作时都使用了utf-8编码影响外
在配置文件hive.exec.compress.output=true情况下,hive会对最终输出结果进行压缩。
压缩算法会使用配置mapred.output.compression.codec=org.apache.Hadoop.io.compress.SnappyCodec。
所以输出的文件在使用cat查看会显示为乱码,需要解压缩文件后查看
snzip -d /path/XXX.snappy服务器本地使用
hadoop fs -text /path/XXX.snappy文件在hdfs中使用
或者在导出数据时配置关闭hive.exec.compress.output参数。
例:
spark-sql --hiveconf hive.exec.compress.output=false -e "INSERT OVERWRITE LOCAL DIRECTORY '/tmp/test' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' stored as textfile select * from test where abc=‘XXX’;”
snappy压缩算法能压缩文件到原来的50%-70%。关闭输出结果压缩的功能后会增大存储空间和网络传输的开销。