我在 Spark 中有一个按
time
排序的 Dataframe,如下所示:
id value time
1 a 2024-01-01 00:00:00
2 a 2024-01-01 00:00:00
2 b 2024-01-03 00:00:00
1 b 2024-01-03 01:00:00
2 c 2024-01-03 02:00:00
我想对Dataframe进行去重,对于每个id,只留下最新的记录。像这样:
id value time
1 b 2024-01-03 01:00:00
2 c 2024-01-03 02:00:00
我尝试使用
dataframe.dropDuplicates('id')
来实现这一点,但似乎不太符合我的要求。
dropDuplicates
选择保留哪条记录的规则是什么? dropDuplicates
总是保留最新记录还是最早记录?或者它只是随机选择一条记录来保留?
您认为使用
Window
功能会怎样?比如这样?
from pyspark.sql import Window
import pyspark.sql.functions as f
w1 = Window.partitionBy("id").orderBy(f.col("time").desc())
df.withColumn("row_num", f.row_number().over(w1)) \
.filter(f.col("row_num") == 1) \
.drop("row_num") \
.show()