删除与某些行重复的所有行

时间:2018-07-25 15:30:12

标签: python pyspark apache-spark-sql pyspark-sql

我看到了这样的几个问题,但对我的情况却不是令人满意的答案。这是一个示例DataFrame:

+------+-----+----+
|    id|value|type|
+------+-----+----+
|283924|  1.5|   0|
|283924|  1.5|   1|
|982384|  3.0|   0|
|982384|  3.0|   1|
|892383|  2.0|   0|
|892383|  2.5|   1|
+------+-----+----+

我只想通过"id""value"列来识别重复项,然后删除所有实例。

在这种情况下:

  • 行1和行2是重复的(同样,我们忽略了“类型”列)
  • 第3行和第4行是重复的,因此仅应保留第5行和第6行:

输出为:

+------+-----+----+
|    id|value|type|
+------+-----+----+
|892383|  2.5|   1|
|892383|  2.0|   0|
+------+-----+----+

我尝试过

df.dropDuplicates(subset = ['id', 'value'], keep = False)

但是PySpark中没有“保持”功能(pandas.DataFrame.drop_duplicates中没有。

我还能怎么做?

2 个答案:

答案 0 :(得分:2)

您可以使用窗口功能

from pyspark.sql import Window, functions as F
df.withColumn(
  'fg', 
  F.count("id").over(Window.partitionBy("id", "value"))
).where("fg = 1").drop("fg").show()

答案 1 :(得分:1)

您可以groupByidtype来获取计数。然后使用join过滤掉DataFrame中计数不是1的行:

df.join(
    df.groupBy('id', 'value').count().where('count = 1').drop('count'), on=['id', 'value']
).show()
#+------+-----+----+
#|    id|value|type|
#+------+-----+----+
#|892383|  2.5|   1|
#|892383|  2.0|   0|
#+------+-----+----+