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

Spark如何获取包含至少一个null值的DataFrame列名

如何找出Spark DataFrame中包含Null值的列名

嘿,针对你提供的这个Spark DataFrame:

val dataset = sparkSession.createDataFrame(Seq( (7, null, 18, 1.0), (8, "CA", null, 0.0), (9, "NZ", 15, 0.0) )).toDF("id", "country", "hour", "clicked")

对应的数据集如下:

id country hour clicked
7 null 18 1
8 "CA" null 0
9 "NZ" 15 0

我整理了两种靠谱的方法来找出所有至少包含一个null值的列名,最终都会得到你期望的country和hour:

方法一:高效聚合统计(推荐)

这种方式只需要一次聚合操作就能统计所有列的空值数量,性能更优,适合大数据集:

import org.apache.spark.sql.functions.{col, isnull, count, when}

// 先统计每列的空值数量,再筛选出空值数>0的列
val colsWithNulls = dataset
  .agg(
    dataset.columns.map(column => count(when(isnull(col(column)), 1)).alias(column)): _*
  )
  .first()
  .getValuesMap[Long](dataset.columns)
  .filter(_._2 > 0)
  .keys
  .toList

// 执行后colsWithNulls的值就是 List(country, hour)

简单解释下步骤:

  • 遍历DataFrame的所有列,对每列用count(when(isnull(col), 1))计算空值的个数
  • first()拿到聚合后的唯一一行结果
  • getValuesMap把这行数据转成列名到空值数量的键值对
  • 最后过滤出空值数量大于0的列名即可

方法二:快速验证版(小数据集适用)

如果你的数据集不大,想快速验证结果,也可以用这种更直观的方式,但它会对每列单独执行count操作,大数据集下性能不如第一种:

import org.apache.spark.sql.functions.{col, isnull}

val colsWithNulls = dataset.columns.filter { column =>
  dataset.select(col(column)).where(isnull(col(column))).count() > 0
}

这种写法逻辑很直接:对每个列,检查该列是否存在null值,存在就保留列名。

两种方法都能完美得到你要的结果,根据你的数据集大小选合适的就行~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:14:08