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
相关产品推荐
相关产品推荐

