PySpark报错:'Column'对象不可调用,求两种空值统计写法差异
PySpark空值统计两种写法的差异与报错原因
报错原因(第一种写法失败)
第一种写法:
[col(c).isNull().count() for c in df.columns]
这里的col(c).isNull()返回的是Column类型对象,它代表的是数据集中每一行对应列是否为空的布尔判断逻辑,并非实际的数据集结果。而Column类并没有定义可调用的count()方法——你错误地把DataFrame的count()方法(用于统计行数)和Column的操作混淆了,因此抛出TypeError: 'Column' object is not callable。
第二种写法可行的原因
第二种写法:
[df.filter(col(c).isNull()).count() for c in df.columns]
逻辑拆解:
col(c).isNull()生成布尔Column,作为过滤条件传入df.filter()df.filter(...)返回一个新的DataFrame,仅包含该列为空的行- 调用DataFrame的
count()方法,统计这个过滤后DataFrame的总行数,也就是对应列的空值数量
补充:更高效的写法
循环调用filter().count()会触发多次Spark Job(每个列一次),效率较低。推荐用一次Action操作完成所有列的空值统计:
from pyspark.sql.functions import col, count, when # 一次性统计所有列的空值数,返回结果为一行的DataFrame null_counts_df = df.select([count(when(col(c).isNull(), 1)).alias(c) for c in df.columns]) # 转为字典方便查看 null_counts = null_counts_df.collect()[0].asDict() print(null_counts)
内容的提问来源于stack exchange,提问作者aroyc
相关产品推荐
相关产品推荐

