如何移除PySpark DataFrame列中的双引号?CSV读写场景
Spark读写CSV移除字段首尾双引号的解决办法
先明确需求:把CSV里类似"xyznm""cxvb"的字段,去掉首尾的双引号,保留中间的"",最终得到xyznm""cxvb。你当前代码里的escape='\"'仅用于处理字段内部的转义引号,没覆盖首尾包围引号的清理需求。
直接上可行方案
第一步:读取数据并清理首尾引号
先按原有逻辑读取CSV,再用正则表达式精准移除字段首尾的双引号,中间的连续引号会完整保留:
from pyspark.sql.functions import regexp_replace, col # 按你的原有配置读取CSV文件 df = spark.read.format("com.databricks.spark.csv") \ .option("delimiter", "|") \ .options(header='true', escape='\"') \ .load("my_path") # 清理col1字段首尾的双引号,内部的""不受影响 df_cleaned = df.withColumn("col1", regexp_replace(col("col1"), "^\"|\"$", "")) # 查看清理后的结果 df_cleaned.show()
这里的正则^\"|\"$专门匹配字段开头或结尾的单个双引号,替换为空即可完成清理。
第二步:写入时避免自动添加引号
写入时必须设置quoteMode="NONE",防止Spark自动给字段重新套上引号:
df_cleaned.write.format('com.databricks.spark.csv') \ .mode('overwrite') \ .option("sep", "|") \ .option("header", "True") \ .option("quoteMode", "NONE") \ .option("nullValue", "") \ .save("path")
可选读取思路
如果原始CSV里的字段引号只是多余的包围,内部的""是实际内容而非转义符,可以直接在读取时禁用引号解析,再做清理:
df = spark.read.format("com.databricks.spark.csv") \ .option("delimiter", "|") \ .option("header", "true") \ .option("quote", None) # 禁用引号解析,完整读取原始字段内容 .load("my_path") # 同样用正则清理首尾引号 df_cleaned = df.withColumn("col1", regexp_replace(col("col1"), "^\"|\"$", ""))
验证结果
处理后的DataFrame显示如下,完全符合期望:
+-----------+ | col1| +-----------+ |xyznm""cxvb| +-----------+
写入后的CSV文件内容也会和上述结果一致。
内容的提问来源于stack exchange,提问作者alka
相关产品推荐
相关产品推荐

