Scala DataFrame写入CSV时如何移除空值对应的空双引号
Spark写入CSV空值带双引号问题解决方案
问题本质
Spark CSV数据源默认写入逻辑中,空字符串""会被识别为普通字符串值,按照引用规则包裹双引号输出;未显式配置空值映射规则时,null值和空字符串都会出现带引号的空输出,和你遇到的现象完全匹配。
解决方案
方案1:直接配置写入参数(90%以上场景适用)
在原有写入逻辑中补充两个option配置,直接指定空字符串、null值对应的输出内容为空,即可让空位置不输出任何带引号的内容,修改后代码如下:
tableDF.coalesce(1) .write .option("header", includeColumnNames) .option("emptyValue", "") // 空字符串映射为无引号空内容 .option("nullValue", "") // null值映射为无引号空内容 .mode(SaveMode.Overwrite) .csv(pathToFolderWithCSV)
注意:保持quoteAll参数为默认值false即可,不要手动设置为true,否则会强制给所有值包裹双引号。
方案2:前置清洗空值(方案1不生效时使用)
如果配置参数后仍有部分列输出"",说明对应列的空值是带空格的不可见字符串,先做一轮数据清洗,把所有空值/全空格值统一替换为null后再写入即可:
import org.apache.spark.sql.functions._ // 遍历所有列,将空字符串、全空格字符串替换为null val cleanedDF = tableDF.columns.foldLeft(tableDF) { (tempDF, colName) => tempDF.withColumn( colName, when(trim(col(colName)) === "", lit(null)).otherwise(col(colName)) ) } // 按参数配置写入 cleanedDF.coalesce(1) .write .option("header", includeColumnNames) .option("nullValue", "") .mode(SaveMode.Overwrite) .csv(pathToFolderWithCSV)
效果验证
配置完成后,空值位置会直接留空,输出结果和预期完全一致:
col1,col2,col3,col4 "abc","sss",,"aaa"
内容的提问来源于stack exchange,提问作者SSR
相关产品推荐
相关产品推荐

