我正在用scala学习火花。我有一个由两列组成的数据框。
col1 col2
a 1
b 1
b 2
c 1
c 3
b 4
d 5
我想删除col2中的值只出现一次的所有行(2,3,4和5)。基本上,我正在寻找的是与dropDuplicates相反。
答案 0 :(得分:2)
您可以使用groupBy
计算要删除的行,然后执行左反连接以过滤dem:
df.join(
df.groupBy($"col2")
.agg(count($"col2").as("count"))
.where($"count"===1),
Seq("col2"),
"leftanti"
)
或者使用窗口函数:
df
.withColumn("count",count($"col2").over(Window.partitionBy($"col2")))
.where($"count">1).drop($"count")
答案 1 :(得分:1)
这是一种涉及窗口函数的方法。这里的想法是使用由col2
排序的窗口并检查相邻记录 - 如果上一个或下一个记录具有相同的col2
值 - 保留记录:
import org.apache.spark.sql.functions._
import spark.implicits._
val window = Window.orderBy("col2")
val result = df
.withColumn("prev", lag($"col2", 1).over(window))
.withColumn("next", lead($"col2", 1).over(window))
.where($"prev" === $"col2" or $"next" === $"col2")
.drop("prev", "next")