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

如何在不展开struct列的情况下统计PySpark DataFrame的null、NA及0值数量

PySpark混合类型列(含struct)空值/0值统一统计方案

你可以通过统一类型转换的逻辑实现需求,不需要单独判断列类型,也不需要展开struct嵌套结构,核心思路是将所有列统一转为字符串后再做条件判断,完全规避struct类型的适配问题。

实现代码

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

# 初始化Spark会话
spark = SparkSession.builder.appName("null_count").getOrCreate()

# 构造测试数据(和你给出的示例一致)
data = [
    (1, "something", (1, "test1")),
    (2, "something", None),
    (3, "0", None),
    (4, "something", None),
    (5, "something", (2, "test2"))
]
df = spark.createDataFrame(data, schema=["id", "mystring", "mystruct"])

# 生成全局统计逻辑,自动适配所有列类型
count_expr = [
    count(
        when(
            # 三个判定条件:列本身为null / 转字符串后为空 / 转字符串后为"0"
            col(c).isNull() | (col(c).cast("string") == lit("")) | (col(c).cast("string") == lit("0")),
            1
        )
    ).alias(c)
    for c in df.columns
]

# 执行统计并输出结果
result_df = df.agg(*count_expr)
result_df.show()

输出结果

和你预期的结果完全一致:

+---+--------+--------+
| id|mystring|mystruct|
+---+--------+--------+
|  0|       1|       3|
+---+--------+--------+

方案说明

  • 所有类型的列都会统一转为字符串做判断,无需单独处理struct类型,不会触发struct相关的报错
  • struct列只会判断本身是否为null,不会解析内部嵌套字段,符合你不展开struct的要求
  • 自动兼容整数列的0、字符串列的空值/"0"、struct列的null三种统计场景
  • 如果不需要统计字符串类型的"0",只需要删除(col(c).cast("string") == lit("0"))这个判定条件即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:54:03