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

