导出DataFrame至CSV时如何正确处理双引号问题
解决Spark导出CSV时双引号显示异常的问题
你的问题出在手动提前替换双引号上——Spark的CSV写入器本身已经完全遵循CSV规范处理双引号转义,手动替换会导致重复转义,最终出现异常显示。
问题分析
当你用regexp_replace把单个双引号替换为两个后,Spark CSV Writer在导出时会再次对双引号进行转义(CSV规范要求字段内的双引号用两个双引号表示),相当于把原本的"变成"",再转义一次变成"""",最终输出的内容就会出现多余的双引号。
正确解决方案
移除手动替换双引号的代码,直接依靠Spark CSV Writer的内置处理逻辑即可。以下是修正后的完整代码:
import org.apache.spark.sql.SparkSession val spark = SparkSession.builder().appName("CSVExport").getOrCreate() import spark.implicits._ // 原始DataFrame,包含逗号和双引号 val df = Seq((1, "A,B,C,\"DEF\""), (2, "DEF")).toDF("ID", "Val") // 直接导出,无需手动处理双引号 df.coalesce(1).write .option("header", true) .option("encoding", "utf-8") .option("quoteAll", true) // 给所有字段添加引号,符合你的需求 .option("escape", "\"") // 显式指定转义字符为双引号(默认就是该值,可省略) .mode("Overwrite") .csv("[Location to store csv]")
效果验证
导出后的CSV内容会符合预期:
ID,Val "1","A,B,C,""DEF""" "2","DEF"
这个格式完全符合CSV规范,任何标准的CSV解析器都能正确识别其中的双引号和逗号。
内容的提问来源于stack exchange,提问作者ConfusedDeveloper
相关产品推荐
相关产品推荐

