如何使用Spark Scala移除CSV文件中的字段前置双引号?
Spark Scala 实现分号分隔CSV字段双引号移除
核心实现思路
当前处理的CSV文件存在格式不规范特征:字段双引号匹配不完整,部分字段仅保留开头双引号、缺失闭合引号,无法直接通过Spark原生CSV解析器的默认配置完成引号剥离,可通过两种可落地的方案实现需求。
方案一:原始文本逐行处理(强适配性)
该方案不依赖Spark的CSV解析逻辑,完全手动处理文本内容,对格式异常的兼容度最高。
- 核心处理逻辑:读取文件为纯文本行,全局移除所有双引号字符,按分号切分字段后组装结构化表
- 示例代码:
import org.apache.spark.sql.SparkSession import org.apache.spark.sql.Row import org.apache.spark.sql.types._ val spark = SparkSession.builder() .appName("RemoveFieldQuotes") .master("local[*]") .getOrCreate() // 读取原始文本,不触发CSV解析 val rawLineRDD = spark.sparkContext.textFile("你的CSV文件存储路径") // 逐行清洗处理 val cleanedRowRDD = rawLineRDD.map(line => { // 移除所有双引号字符,覆盖开头引号、残留引号场景 val noQuoteLine = line.replace("\"", "") // 按分号切分字段,过滤行尾分号产生的空字段 val fieldList = noQuoteLine.split(";").filter(_.trim.nonEmpty) Row.fromSeq(fieldList) }) // 定义匹配表头的表结构 val tableSchema = StructType(Seq( StructField("age", IntegerType), StructField("job", StringType), StructField("marital status", StringType) )) val resultDF = spark.createDataFrame(cleanedRowRDD, tableSchema) resultDF.show()
- 适配场景:文件存在零散双引号、引号缺失、错位等任意格式异常时都可正常处理,示例输入
58;"technician";"married;经过处理后会输出对应字段的干净值。
方案二:调整CSV解析参数(轻量实现)
该方案通过修改Spark CSV解析器的默认配置,让解析器自动完成引号剥离,不需要手动逐行切分字段。
- 核心配置逻辑:关闭解析器对双引号的特殊识别,让解析器把字段首尾的双引号识别为普通文本内容,通过首尾裁剪配置自动移除
- 配置参数说明:
sep:指定分隔符为分号;quote:将识别的引号字符设置为文本中不存在的特殊控制字符(如\u0000),关闭双引号特殊识别逻辑ignoreLeadingWhiteSpace/ignoreTrailingWhiteSpace:开启字段首尾内容裁剪,自动移除字段开头/结尾的双引号
- 示例代码:
val resultDF = spark.read .option("sep", ";") // 关闭双引号的特殊识别逻辑 .option("quote", "\u0000") // 开启首尾裁剪,自动移除字段首尾的双引号 .option("ignoreLeadingWhiteSpace", "true") .option("ignoreTrailingWhiteSpace", "true") .option("header", "true") .csv("你的CSV文件存储路径") resultDF.show()
- 注意事项:该方案适合字段位置规整、仅存在引号匹配异常的文件,如果文件存在字段错位、分隔符出现在文本内容中的场景,需要搭配方案一的手动处理逻辑。
内容的提问来源于stack exchange,提问作者Joyce
相关产品推荐
相关产品推荐

