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

如何高效统计Spark DataFrame中Null、NaN等空值的总数量

问题根因

isnan() 函数仅支持对float、double类型的列调用,传入date、timestamp、string等类型时会直接报错。之前的实现通过过滤排除非数值列的方式规避报错,一方面会丢失非数值列的空值统计能力,另一方面提前转Pandas的操作会增加大量IO开销,是性能低的核心原因。

优化实现

import pyspark.sql.functions as F

def count_missings(spark_df, sort=True):
    exprs = []
    for col_name, col_type in spark_df.dtypes:
        # 仅浮点类型存在NaN,其他类型仅需判断Null即可
        if col_type in ("float", "double"):
            miss_cond = F.isnan(col_name) | F.isnull(col_name)
        else:
            miss_cond = F.isnull(col_name)
        exprs.append(F.count(F.when(miss_cond, 1)).alias(col_name))
    
    # 所有统计逻辑在Spark分布式层完成,仅最后做一次Pandas转换
    result_pd = spark_df.select(*exprs).toPandas()
    
    if sort:
        return result_pd.rename(index={0: "count"}).T.sort_values("count", ascending=False)
    return result_pd

如果不需要返回Pandas格式,直接保留Spark DataFrame结果,可以去掉toPandas操作,性能会更高:

def count_missings_spark(spark_df):
    exprs = []
    for col_name, col_type in spark_df.dtypes:
        if col_type in ("float", "double"):
            miss_cond = F.isnan(col_name) | F.isnull(col_name)
        else:
            miss_cond = F.isnull(col_name)
        exprs.append(F.count(F.when(miss_cond, 1)).alias(col_name))
    return spark_df.select(*exprs)

核心优化点

  • 按字段类型区分空值判断逻辑:既解决了非数值类型调用isnan()报错的问题,也支持全列的空值统计,不会丢失非数值列的统计结果
  • 没有冗余计算逻辑,性能和原生Spark聚合操作完全一致,可支持超大规模数据集的空值统计
  • 大幅降低了driver与executor的交互开销,仅在最终返回前做一次数据同步,避免多余IO

内容的提问来源于stack exchange,提问作者John Constantine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:36:02