Spark DataFrame写入CSV时如何让转义反斜杠生效?
PySpark读取含转义竖线的CSV文件解决方案
问题背景
在Databricks 11.3(Spark 3.3.0、Scala 2.12)环境下用PySpark处理竖线(|)分隔的CSV文件时遇到以下问题:
- CSV数据中存在用反斜杠(
\)转义的内部竖线,但默认配置读取后出现列偏移、Country字段丢失,反斜杠未被正确处理 - 调整数据引号包裹方式后列偏移问题解决,但Address字段内的反斜杠仍残留,需移除反斜杠并保留原始竖线
输入数据示例
name |Job |Address |State|Country John Smith|Truck Driver|"215 Montain Road \| Apt A, Atlanta"|GA|USA Henry John|Mechanic|"645 Village Square \| Unit D, Dover"|DE|USA Eric Donald|Cook|"737 Brighton Square \| Unit H Rockville"|MD|USA Rebecca Jones |Manager|"956 Country Road \|Unit E, Columbia"|MD|USA
尝试过的代码
初始代码(列偏移、字段丢失)
df = spark.read.option("header","true").option("escape", "\\").option("delimiter", "|").csv("dbfs:/FileStore/test.csv") display(df)
调整后代码(列偏移解决,但反斜杠残留)
df = spark.read.option("header","true").option("quotechar", '\\').option("quote", "\"").option("escape", "\"").option("delimiter", "|").csv("dbfs:/FileStore/test-2.csv") display(df)
可行解决方案
方案1:正确配置CSV读取参数
核心是让Spark同时识别双引号包裹的字段和反斜杠转义符,自动处理转义内容:
df = spark.read.option("header", "true") \ .option("delimiter", "|") \ .option("quote", "\"") \ # 识别双引号作为字段包裹符 .option("escape", "\\") \ # 识别反斜杠作为转义符 .csv("dbfs:/FileStore/test.csv") display(df)
此配置下,Spark会将双引号内的内容视为完整字段,自动移除反斜杠并保留竖线,彻底解决列偏移和字段丢失问题。
方案2:正则替换兜底处理(若方案1仍有残留)
如果因数据格式特殊导致反斜杠未被自动移除,可通过正则表达式精准替换Address字段中的转义符:
from pyspark.sql.functions import regexp_replace # 替换Address字段中的"\|"为"|" df_clean = df.withColumn("Address", regexp_replace("Address", r"\\\|", "|")) display(df_clean)
关键原因说明
- 初始代码未设置
quote参数,Spark无法识别双引号包裹的字段,误将引号内的转义竖线当作分隔符,引发列偏移 - 调整后代码错误将
escape设为双引号,导致反斜杠未被当作转义符解析,因此残留 - 正确配置需同时启用
quote和escape参数,让Spark按照CSV规范解析转义内容
内容的提问来源于stack exchange,提问作者user2647763 - RIMD
相关产品推荐
相关产品推荐

