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

使用Spark解析含逗号、引号及JSON字符串的CSV文件遇列拆分异常

问题描述

我的CSV文件包含30余列,其中部分列是类似"{\"name\": \"value1\",\"name2\": \"value2\"}"的JSON字符串。使用Scala Spark解析该文件时,JSON字符串中的逗号被识别为列分隔符,导致内容被拆分到不同列。当前读取代码如下:

val spark = SparkSession.builder
  .appName("ReadCSVExample")
  .master("local")  // Set your master URL appropriately
  .getOrCreate()

val csvOptions = Map(
  "header" -> "true",          // If CSV has header row
)

val df: DataFrame = spark.read.options(csvOptions).csv(csvFilePath)

已尝试设置"escapeQuote" -> "true"但未解决问题,寻求帮助。

解决方案

针对嵌套JSON字符串的CSV文件,需要调整Spark CSV读取器的引号与转义参数,具体如下:

调整读取配置

修改csvOptions,添加关键参数以正确识别JSON格式的列内容:

val csvOptions = Map(
  "header" -> "true",
  "quote" -> "\"",          // 指定双引号为包裹字符
  "escape" -> "\\",         // 指定反斜杠为转义字符,匹配JSON中的转义规则
  "multiLine" -> "false"    // 若JSON字符串不含换行则保持false,有换行则设为true
)

参数说明

  • escapeQuote参数仅作用于用引号转义引号的场景(如""表示单个双引号),但你的JSON使用反斜杠转义引号(\"),因此该参数不适用。
  • 显式指定escape为\后,Spark会忽略JSON字符串内部的转义引号与逗号,不会将其误判为列分隔符。

后续解析JSON列(可选)

若需要将JSON字符串解析为结构化数据,可使用from_json函数:

import org.apache.spark.sql.functions.from_json
import org.apache.spark.sql.types.{StructType, StructField, StringType}

// 定义JSON对应的Schema
val jsonSchema = StructType(Seq(
  StructField("name", StringType),
  StructField("name2", StringType)
))

// 解析指定JSON列
val parsedDf = df.withColumn("parsed_json", from_json(df("your_json_column_name"), jsonSchema))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:32:53