You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark DataFrame移除None值失败:isNotNull过滤无效的问题排查

问题原因

你遇到的问题核心是Pandas数值列中的None会被自动转为NaN,而Spark里NaN和Null是两个不同的概念:

  • isNotNull()仅判断值是否为Spark标准的Null,不会识别并过滤NaN
  • 当你用spark.createDataFrame()转换Pandas DataFrame时,Pandas里带None的整数列会被转为浮点型(比如float64),对应Spark的DoubleType,此时原None变成了NaN,所以isNotNull()过滤无效。
解决方法

方法1:同时过滤Null和NaN

直接在过滤条件中同时排除两种情况:

df_spark.filter(df_spark.num.isNotNull() & ~df_spark.num.isNaN()).show()

方法2:提前设置Pandas列的Nullable整数类型

在创建Pandas DataFrame时,给num列指定支持空值的整数类型(Int64),这样转Spark时None会被识别为Spark的Null,后续用isNotNull()就能正常过滤:

df = pd.DataFrame(
    {
        'rid': ['A', 'B', 'C'],
        'num': [None, 8, 9],
        'availability_percent': [56, 69, 70],
        'availability_spaces': [7, 6, 5]
    },
    dtype={'num': 'Int64'}  # 指定Nullable整数类型
)
df_spark = spark.createDataFrame(df)
df_spark.filter(df_spark.num.isNotNull()).show()

验证列类型(可选)

可以先打印Spark DataFrame的Schema确认列类型:

df_spark.printSchema()

如果是方法1的情况,num列类型会是double;方法2则会是integer(且支持空值)。

内容的提问来源于stack exchange,提问作者Victoria Fetescu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 04:52:23