Spark在新建Hadoop集群写CSV强制UTF-8却存为二进制,如何解决?
问题解决方案
1. 关闭默认压缩配置
新集群大概率开启了HDFS层或Spark写入的默认压缩,你看到的「二进制格式」实际是被gzip/snappy等算法压缩的文件,旧集群未开启默认压缩所以输出明文CSV,可直接在代码中新增配置强制关闭压缩:
df.coalesce(1) .write .format("csv") .mode(saveMode) .option("header",true) .option("encoding", "UTF-8") .option("compression", "none") // 新增该行强制关闭压缩 .save(hdfspath)
也可以在提交Spark任务时添加全局参数关闭压缩:--conf spark.sql.parquet.compression.codec=none --conf spark.hadoop.mapreduce.output.fileoutputformat.compress=false
2. 适配Spark版本差异
如果新旧集群Spark大版本差异超过2个小版本(比如旧集群用Spark2.4、新集群用Spark3.3),部分版本存在CSV编码参数不生效的已知bug,可选择两种处理方式:
- 显式指定带BOM的UTF-8编码适配下游识别:
.option("encoding", "UTF-8 BOM") - 提交任务时指定与旧集群一致的Spark版本运行,避免兼容问题
3. 强制指定文本输出格式
部分企业定制的新Hadoop集群会默认修改FileOutputFormat实现,强制对文本输出做二进制封装,可在提交任务时添加参数显式指定文本输出类:--conf spark.hadoop.mapreduce.job.outputformat.class=org.apache.hadoop.mapreduce.lib.output.TextOutputFormat
4. 修正文件识别异常
不要仅根据文件后缀或文件管理器的标识判断格式,可把文件下载到本地后执行file 输出文件名命令验证实际编码,如果确认是UTF-8格式仅识别异常,可在写入完成后调用Hadoop API把输出文件后缀修改为.csv即可。
内容的提问来源于stack exchange,提问作者A-Rahman
相关产品推荐
相关产品推荐

