Python Pyspark-基于其他值的比较删除具有匹配值的行
我定期向我提供的文件中有如下数据Python Pyspark-基于其他值的比较删除具有匹配值的行,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我定期向我提供的文件中有如下数据 2018-11-06 00 46 3574 2018-11-06 01 21 1667 2018-11-06 02 22 1650 我经常会在后续文件中得到重复的文件,我会用以下方式处理这些文件: df2=df
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
我不知道怎么做。感觉我需要利用一个窗口,但我不知道怎么做。实现这一点最简单的方法是使用
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")
如果第四列匹配,但第三列不同,会发生什么情况?我想不出会发生什么情况,但如果发生这种情况,我也希望保持最大的一列。所以这似乎是可行的。我将深入研究数据以确定,一旦确定,我是否会将其作为答案进行核对。