Scala 仅保留dataframe列中具有重复值的行
我正在用scala学习spark。我有一个由两列组成的数据帧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.
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就可以了。我想我会使用第一种方法,就像我不需要窗口函数一样,也许我以后会进一步研究:)