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

PySpark统计DataFrame空值时报AnalysisException: need struct type but got double

异常原因

isnan() 函数要求传入参数为 PySpark 的 Column 类型对象,你当前代码中直接传入了字符串格式的列名,Spark 会将该语法识别为结构体(struct)类型列的嵌套字段提取逻辑,试图从当前列中提取对应名称的嵌套字段。你的 DataFrame 中所有列均非 struct 类型(例如报错提到的 place 列是 double 类型),不符合嵌套字段提取的要求,因此抛出类型不匹配的异常。
另外补充注意:isnan() 仅适用于数值类型列(int、long、float、double等),用于判断值是否为非数值 NaN,字符串、布尔类型列不存在 NaN 场景,无需调用该函数判断。

解决方案

方法1:按列类型适配统计(推荐)

根据列的类型分别做判断逻辑,避免类型不兼容问题:

from pyspark.sql.functions import col, count, when, isnan

df_mis = df.select([
    count(when(
        # 数值列同时判断 NaN 和 null,非数值列仅判断 null
        (isnan(col(c)) | col(c).isNull()) if t in ("int", "long", "float", "double")
        else col(c).isNull(),
    c)).alias(c)
    for c, t in df.dtypes
])
df_mis.show()

方法2:简化通用写法

如果无需严格区分 NaN 和普通空值,可以统一转字符串后判断,适配所有列类型:

from pyspark.sql.functions import col, count, when

df_mis = df.select([
    count(when(col(c).isNull() | (col(c).cast("string") == "NaN"), c)).alias(c)
    for c in df.columns
])
df_mis.show()

内容的提问来源于stack exchange,提问作者Subhransu Nanda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:54:08