仅保留数据框列中具有重复值的行

时间:2018-02-02 14:03:03

标签: scala apache-spark dataframe

我正在用scala学习火花。我有一个由两列组成的数据框。

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

我想删除col2中的值只出现一次的所有行(2,3,4和5)。基本上,我正在寻找的是与dropDuplicates相反。

2 个答案:

答案 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")