由zero323建议的解决方案。
原始解决方案:https :
//stackoverflow.com/a/35226857/1560062
首先,计算每个(x,y)组合的出现次数。
counts = df.groupBy(['x', 'y']).count().alias('counts')counts.show()## +---+---+-----+## | x| y|count|## +---+---+-----+## | 0| 1| 2|## | 0| 3| 2|## | 0| 4| 2|## | 1| 1| 3|## | 1| 3| 1|## +---+---+-----+解决方案1:按“ x”分组,通过取每组中计数的最大值进行汇总。最后,删除“计数”列。
result = (counts .groupBy('x') .agg(F.max(F.struct(F.col('count'), F.col('y'))).alias('max')) .select(F.col('x'), F.col('max.y')) )result.show()## +---+---+## | x| y|## +---+---+## | 0| 4|## | 1| 1|## +---+---+解决方案2:使用窗口,按“ x”进行分区,并按“ count”列进行排序。现在,在每个分区中选择第一行。
win = Window().partitionBy('x').orderBy(F.col('count').desc())result = (counts .withColumn('row_num', F.rowNumber().over(win)) .where(F.col('row_num') == 1) .select('x', 'y') )result.show()## +---+---+## | x| y|## +---+---+## | 0| 1|## | 1| 1|## +---+---+由于行的排序方式,两个结果有不同的结果。如果没有联系,则两种方法得出的结果相同。



