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

