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

Scala/Spark如何获取未通过df.filter()过滤的DataFrame行记录?

在Spark Scala中同时获取过滤后的符合与不符合条件的DataFrame

有两种实用的方法可以实现你的需求,分别适配不同场景:

方法一:直接复用过滤条件(简单直观)

先定义好过滤条件变量,再分别用该条件和取反后的条件过滤原DataFrame:

// 示例过滤条件:age大于18
val filterCondition = col("age") > 18

// 获取符合条件的DataFrame
val matchedDF = df.filter(filterCondition)

// 获取不符合条件的DataFrame,对原条件取反即可
val unmatchedDF = df.filter(!filterCondition)

也可以用where替代filter,两者功能完全一致:

val unmatchedDF = df.where(!filterCondition)

方法二:添加标记列后拆分(性能更优)

如果你的DataFrame数据量较大,这种方法能避免Spark重复扫描原数据,性能更高效:

// 定义过滤条件
val filterCondition = col("age") > 18

// 添加标记列,标记每行是否符合条件
val markedDF = df.withColumn("is_matched", when(filterCondition, lit(true)).otherwise(lit(false)))

// 根据标记列拆分出两个DataFrame,最后删除标记列
val matchedDF = markedDF.filter(col("is_matched") === true).drop("is_matched")
val unmatchedDF = markedDF.filter(col("is_matched") === false).drop("is_matched")

注意事项

  • 如果过滤条件涉及可能为null的列,建议加入null判断,避免非预期结果:
    val filterCondition = col("age").isNotNull && col("age") > 18
    
  • 两种方法输出结果完全一致,可根据数据规模和性能需求选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 15:00:02