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

