You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 00:55:06