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

Databricks Spark中CSV内嵌双引号的解析问题求助

解决Spark读取包含特殊内嵌双引号的CSV问题

方案一:调整CSV读取参数(推荐)

你的CSV格式符合双引号转义双引号的CSV规范,字段内容本身包含首尾双引号,导致整个字段被写成"""内容"""(外层双引号是字段包裹符,内部双引号用两个表示)。只需移除多余的escapeQuotes参数(该参数仅作用于CSV写入,读取时无效),并确保核心参数正确设置:

df = (spark
    .read
    .format("csv")
    .option("header", True)
    .option("delimiter", ",")
    .option("multiline", True)
    .option("quote", "\"")  # 默认值,可省略
    .option("escape", "\"")
    .schema(raw_schema)
    .csv(landing_schema_file)
)

原理说明

  • quote="\"":指定CSV字段的包裹符为单个双引号(Spark默认值)
  • escape="\"":指定用双引号转义双引号,字段内的""会被自动解析为单个"
  • 移除escapeQuotes:该参数仅控制写入CSV时的引号转义逻辑,对读取无作用

执行后第二个字段会被正确解析为:
"LEGOS s.r.o.", švédsky "LEGOS bolag med begr.amsvar"


方案二:手动解析(参数配置无效时备用)

如果CSV存在非标准格式导致参数配置失效,可以先读取整行文本,再通过正则手动解析:

from pyspark.sql.functions import udf, col
from pyspark.sql.types import ArrayType, StringType
import re

# 1. 读取所有行为单个文本列
raw_df = spark.read.text(landing_schema_file)

# 2. 提取表头
header_row = raw_df.first()[0]
header = [h.strip('"') for h in re.findall(r'"([^"]*)"', header_row)]

# 3. 定义解析函数:匹配两种字段格式,替换内部""为"
def parse_line(line):
    pattern = r'"([^"]*)"|"""([^"]*)"""'
    fields = []
    for match in re.findall(pattern, line):
        if match[0]:
            fields.append(match[0])
        else:
            fields.append(match[1].replace('""', '"'))
    return fields

# 4. 注册UDF并解析数据
parse_udf = udf(parse_line, ArrayType(StringType()))
parsed_df = raw_df.withColumn("parsed", parse_udf(col("value")))

# 5. 将数组列拆分为多列匹配表头
final_df = parsed_df.select(*[col("parsed")[i].alias(header[i]) for i in range(len(header))])

内容的提问来源于stack exchange,提问作者BenP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:37:19