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

