You need to enable JavaScript to run this app. Spark 2.4读取CSV生成DataFrame时部分行被误替换为NULL问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

Spark 2.4读取CSV生成DataFrame时部分行被误替换为NULL问题咨询

问题根因
  • Spark读取CSV时默认未显式配置空值识别规则,部分Spark 2.4发行版会默认将不区分大小写的null字符串识别为null值,覆盖所有列类型,导致String类型列中本应保留的nuLL、none等字符串被错误转为null。
  • 当某一行存在多个字段被识别为null时,Spark 2.x的PERMISSIVE解析模式存在已知缺陷,会误将整行所有字段统一置为null,直接导致你遇到的第三行全空问题。
  • 仅设置header参数的读取逻辑未适配你的源数据空值定义,导致解析阶段就出现数据失真,后续空值替换逻辑无法拿到原始正确数据。
解决方法

1. 调整CSV读取参数

显式声明空值识别规则,从读取层面避免错误解析,核心需要配置三个参数:

  • nullValue:指定你需要识别为null的字符串,如果你只希望空单元格视为null,设置为"";如果希望null字符串(不区分大小写)也视为null,设置为"null"
  • caseSensitive:设为false即可不区分大小写匹配nullValue定义的空值字符串
  • emptyValue:指定空单元格在String类型列中的默认值,设为""即可保留为空字符串

2. 调整后的读取代码示例

val dfWithNullEntries = spark.read
  .schema(nullSchema)
  .options(Map(
    "header" -> "true",
    "nullValue" -> "", // 仅空单元格识别为null,若需把null字符串也识别为null可改为"null"
    "caseSensitive" -> "false",
    "emptyValue" -> "",
    "parseMode" -> "PERMISSIVE"
  ))
  .csv("D:\\codebase\\intellij\\sparkbyexamples\\src\\main\\resources\\nullentry.csv")

3. 空值替换逻辑无需修改

你现有基于na.fill的替换逻辑已经可以满足需求:

  • 字符串列a、b、c的null会被替换为""
  • 整数类型列d的null会被替换为0
  • 布尔类型列e的null会被替换为true

内容的提问来源于stack exchange,提问作者anuj shukla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 16:39:02