Pyspark-根据其他值的比较删除具有匹配值的行

时间:2018-11-06 23:30:31

标签: python apache-spark pyspark

我在定期发送给我的文件中拥有如下所示的数据

2018-11-06 00        46      3574                                             
2018-11-06 01        21      1667                                             
2018-11-06 02        22      1650 

我经常在后续文件中得到重复的文件,并使用类似的方法处理这些文件:

df2=df.dropDuplicates()

我的问题是,有时我会得到一个与前两列重复的值,但第三和第四列是不同的。因此,在两个不同的文件中,我可能会得到:

FILE 1
2018-11-06 01        21      1667 

FILE 2
2018-11-06 01        23      1682

然后我的数据框如下所示:

2018-11-06 00        46      3574
2018-11-06 01        21      1667
2018-11-06 01        23      1682
2018-11-06 02        22      1650

发生这种情况时,我希望前2列具有唯一值,而我希望通过将具有最高值的行保留在第4列中来实现。所以我希望我的数据在完成后看起来像这样:

2018-11-06 00        46      3574
2018-11-06 01        23      1682
2018-11-06 02        22      1650

我不知道该怎么做。感觉我需要利用一个窗口,但我不知道该怎么做。

1 个答案:

答案 0 :(得分:2)

最简单的方法是使用rank()。我还没有测试过,但是下面是一些主要的功能代码,应该可以让您有95%的方法。

from pyspark.sql import Window
from pyspark.sql.functions import desc, rank

# The ranking ordering is by col4 descending, then col3 descending as a tiebreaker.
rank_window = Window.partitionBy("col1", "col2").orderBy(desc("col4"), desc("col3"))
df.withColumn("rank", rank().over(rank_window)).filter("rank=1")