在Scala的Apache Spark DataFrame中如何删除非空值全相同的列
Scala 实现删除非空值完全相同列的方案
和你提供的Python版逻辑完全对齐,先对各列空值填充对应列的中位数,再统计每列唯一值数量,删除唯一值数量为1的列即可。
完整实现代码
import org.apache.spark.sql.SparkSession import org.apache.spark.sql.functions._ object DropDuplicateCols { def main(args: Array[String]): Unit = { // 初始化SparkSession val spark = SparkSession.builder() .master("local[*]") .appName("DropSameValueCols") .getOrCreate() import spark.implicits._ // 构造示例数据 val df = Seq( (Some(1), Some(2), Some(3)), (None, Some(2), Some(4)), (Some(1), Some(2), None), (Some(1), Some(2), Some(5)) ).toDF("A", "B", "C") // 核心逻辑 val cols = df.columns // 1. 计算每列中位数,生成填充映射 val medianMap = cols.map(c => c -> df.stat.approxQuantile(c, Array(0.5), 0.001).head ).toMap // 2. 填充空值、NaN val filledDf = df.na.fill(medianMap) // 3. 统计每列去重后的数量 val uniqueCountRow = filledDf.agg( cols.map(c => countDistinct(col(c)).alias(c)): _* ).head() // 4. 筛选要删除的列(唯一值数量为1的列) val colsToDrop = cols.filter(c => uniqueCountRow.getAs[Long](c) == 1) // 5. 删除列得到结果 val dfFilter = df.drop(colsToDrop: _*) // 打印结果验证 dfFilter.show() spark.stop() } }
步骤说明
- 计算各列中位数:调用
approxQuantile方法计算每列0.5分位数(即中位数),第三个参数为精度值,数值越小精度越高,0.001可满足绝大多数场景 - 空值填充:调用
na.fill方法用对应列的中位数填充空值、NaN,和Python版fillna逻辑完全一致 - 统计唯一值数量:对填充后的DataFrame批量统计每列的去重计数
- 筛选待删除列:过滤出去重计数等于1的列,也就是除空值外所有非空值都相同的列
- 执行删除操作:调用
drop方法传入待删除列数组,注意要加:_*将数组展开为可变参数
注意事项
上述代码默认所有列都是数值类型,如果你需要处理字符串等非数值类型,可将中位数填充逻辑替换为对应列的众数填充即可,整体处理流程无需修改。
内容的提问来源于stack exchange,提问作者kspr
相关产品推荐
相关产品推荐

