如何获取Spark DataFrame中所有值均为Null的列名?
嘿,我来帮你搞定这个需求!要找出DataFrame里所有行全为Null的列,这里有两种实用的方法,适配不同场景:
方法一:高效统计筛选(推荐大数据集)
这种方法通过统计每列非Null值的数量,快速定位全Null列,效率很高,适合大数据量的情况:
import org.apache.spark.sql.functions.{count, when} import org.apache.spark.sql.Column // 计算每一列中非Null值的总数 val nonNullCounts = df.select( df.columns.map(c => count(when(col(c).isNotNull, 1)).alias(c)): _* ) // 将统计结果转为Map,方便后续筛选 val countMap = nonNullCounts.head().getValuesMap[Long](df.columns) // 筛选出非Null计数为0的列(也就是全Null列) val allNullColumns = countMap.filter(_._2 == 0).keys.toArray // 输出结果 println(allNullColumns.mkString(", ")) // 输出: id, company
原理说明:count(when(col(c).isNotNull, 1))会统计每列里非Null的行数,如果结果为0,就说明该列所有行都是Null。最后通过过滤统计Map得到目标列名。
方法二:RDD遍历检查(适合小数据集)
如果你的数据集规模不大,也可以用RDD的forall方法逐列验证,逻辑更直观:
// 遍历所有列,检查该列是否每一行都是Null val allNullColumns = df.columns.filter { colName => df.select(col(colName)).rdd.forall(row => row.isNullAt(0)) } // 输出结果 println(allNullColumns.mkString(", "))
注意:这种方法会对每个列做一次全表扫描,数据量大的时候性能不如第一种方法,所以优先选方法一。
两种方法都能准确得到你要的id和company列,按需选用就好~
内容的提问来源于stack exchange,提问作者Ted Kim
相关产品推荐
相关产品推荐

