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

