Scala 仅保留dataframe列中具有重复值的行

Scala 仅保留dataframe列中具有重复值的行,scala,apache-spark,dataframe,Scala,Apache Spark,Dataframe,我正在用scala学习spark。我有一个由两列组成的数据帧 col1 col2 a 1 b 1 b 2 c 1 c 3 b 4 d 5 我想删除col2中的值只存在一次的所有行(2、3、4和5)。基本上,我想要的是做与dropDuplicates相反的事情。这里有一种方法涉及到窗口函数。这里的想法是使用一个按col2排序的窗口,并检查相邻记录-如果上一条或下一条记录具有相同的col2值-保留记录: import org.

我正在用scala学习spark。我有一个由两列组成的数据帧

col1  col2
    a 1 
    b 1 
    b 2 
    c 1 
    c 3 
    b 4 
    d 5 

我想删除col2中的值只存在一次的所有行(2、3、4和5)。基本上,我想要的是做与dropDuplicates相反的事情。

这里有一种方法涉及到窗口函数。这里的想法是使用一个按
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")

您可以使用
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")

谢谢,我只需要导入org.apache.spark.sql.expressions.Window就可以了。我想我会使用第一种方法,就像我不需要窗口函数一样,也许我以后会进一步研究:)