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

Spark Scala统计非Null值异常求助:现有代码误统计Null值

Spark Scala统计列非Null值的正确修复方案

问题根源

你之前的两种写法都存在逻辑问题:

  • 使用count(when(col("processo_situacao").isNotNull, 1).otherwise(0))时,count函数会统计所有非Null的输入值,而0是有效数值(不是Null),所以不管该行是否为Null,都会被计入统计,最终得到的是分组后的总行数,而非目标的非Null值数量。
  • 原写法count(when(col("processo_situacao").isNotNull, col("processo_situacao")))逻辑本身没问题(不满足条件时when返回Null,count会忽略Null),如果仍未得到正确结果,可能是数据中存在空字符串等非Null的空值,但如果仅针对Null值统计,以下几种方法更可靠。

正确解决方案

方案1:使用Spark内置的countNonNull函数(Spark 3.0+支持)

这是最直接的方式,专门用于统计列的非Null值数量:

val df2: DataFrame = df.groupBy(col("ato")).agg(
  max(datediff(lit(dt_ref), col("data_entrada"))).alias("max_data_entrada"),
  count("id_licenca").alias("count_id_licenca"),
  countNonNull(col("processo_situacao")).alias("count_situacao")
)

方案2:用sum替代count结合when

将count换成sum,这样只会累加符合条件的1,忽略0:

val df2: DataFrame = df.groupBy(col("ato")).agg(
  max(datediff(lit(dt_ref), col("data_entrada"))).alias("max_data_entrada"),
  count("id_licenca").alias("count_id_licenca"),
  sum(when(col("processo_situacao").isNotNull, 1).otherwise(0)).alias("count_situacao")
)

方案3:直接使用count(col)

count函数传入列名时,默认只会统计该列的非Null值数量(和count(*)统计总行数的逻辑不同):

val df2: DataFrame = df.groupBy(col("ato")).agg(
  max(datediff(lit(dt_ref), col("data_entrada"))).alias("max_data_entrada"),
  count("id_licenca").alias("count_id_licenca"),
  count(col("processo_situacao")).alias("count_situacao")
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 11:16:19