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

