В первом подходе код итерации должен дублироваться во всех функциях, которые хотят что-то сделать с коллекцией. Второй подход скрывает детали итерации.
Ваш код почти близок к лучшему подходу, но я все же попытался добавить несколько вещей -
1. Рассчитать «top» один раз и использовать его для сравнения.
2.Используйте отдельное определение столбца, это поможет улучшить удобочитаемость и удобство обслуживания.
from pyspark.sql.window import Window
windowSpec = Window.partitionBy('Day')
top = max('sensitive_id').over(windowSpec).alias('top')
df.select('Day','Num','sensitive_id',top).withColumn('top_sensitive_id', expr("CASE WHEN sensitive_id = top THEN top END")).show()