Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pyspark-基于其他值的比较删除具有匹配值的行_Python_Apache Spark_Pyspark - Fatal编程技术网

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

如果第四列匹配,但第三列不同,会发生什么情况?我想不出会发生什么情况,但如果发生这种情况,我也希望保持最大的一列。所以这似乎是可行的。我将深入研究数据以确定,一旦确定,我是否会将其作为答案进行核对。