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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 22:45:00