删除是相对于一些重复的行所有行(Remove all rows that are duplicate

2019-09-28 18:21发布

我见过一对夫妇类似这样的问题,但不是我的情况一个满意的答复。 下面是一个示例数据框:

+------+-----+----+
|    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

我还能怎么做呢?

Answer 1:

你可以做到这一点使用窗口功能

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()


Answer 2:

您可以groupByidtype ,以获得计数。 然后使用join筛选出在你的数据帧中的行,其中数不为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|
#+------+-----+----+


文章来源: Remove all rows that are duplicates with respect to some rows