Вы можете использовать оконную функцию row_number () для достижения этой цели
from pyspark.sql import functions as F
from pyspark.sql import Window as W
_w = W.partitionBy('id').orderBy(F.col('id').desc())
_w = W.partitionBy('id').orderBy(F.col('id').desc())
df_final = df_final.withColumn('rn_no', F.row_number().over(_w))
df_final = df_final.filter(F.col('rn_no') == 1)
df_final.show()
Вывод
id / most_color
1 / red
2 / green
3 / blue
4 / yellow
5 / red
Модифицированная версия: это даст вам наиболее часто используемое / появляющееся значение в группе -
Вход
df_a = spark.createDataFrame([(1,'red'),(2,'green'),(2,'green'),(2,'blue'),(3,'blue'),(4,'yellow'),(4,'pink'),(5,'red')],[ "id","color"])
+---+------+
| id| color|
+---+------+
| 1| red|
| 2| green|
| 2| green|
| 2| blue|
| 3| blue|
| 4|yellow|
| 4| pink|
| 5| red|
+---+------+
# First Group the values to get the max appeared color in a group
df = df_a.groupBy('id','color').agg(F.count('color').alias('count')).orderBy(F.col('id'))
# Now, make a partition and sort of the decending order for each window of ID and take the first value
_w = W.partitionBy('id').orderBy(F.col('count').desc())
df_a = df.withColumn('rn_no', F.row_number().over(_w))
df_a = df_a.filter(F.col('rn_no') == F.lit('1'))
Выход
df_a.show()
+---+-----+-----+-----+
| id|color|count|rn_no|
+---+-----+-----+-----+
| 1| red| 1| 1|
| 2|green| 2| 1|
| 3| blue| 1| 1|
| 4| pink| 1| 1|
| 5| red| 1| 1|
+---+-----+-----+-----+