【发布时间】:2020-09-22 20:58:41
【问题描述】:
你好 Stackoverflow,
我想删除数据框中的所有行,其中 A 列与 B 列中的任何不同值匹配。我希望这个代码块完全做到这一点,但它似乎也删除了 B 列为空的值,这很奇怪,因为过滤器无论如何都应该只考虑 A 列。如何修复此代码以执行预期的行为,即删除数据框中的所有行,其中 A 列与 B 列中的任何不同值匹配。
import spark.implicits._
val df = Seq(
(scala.math.BigDecimal(1) , null),
(scala.math.BigDecimal(2), scala.math.BigDecimal(1)),
(scala.math.BigDecimal(3), scala.math.BigDecimal(4)),
(scala.math.BigDecimal(4), null),
(scala.math.BigDecimal(5), null),
(scala.math.BigDecimal(6), null)
).toDF("A", "B")
// correct, has 1, 4
val to_remove = df
.filter(
df.col("B").isNotNull
).select(
df("B")
).distinct()
// incorrect, returns 2, 3 instead of 2, 3, 5, 6
val final = df.filter(!df.col("A").isin(to_remove.col("B")))
// 4 != 2
assert(4 === final.collect().length)
【问题讨论】:
标签: scala dataframe apache-spark filter apache-spark-sql