DataFrame.dropDuplicates 在 Spark 中表现如何?

问题描述 投票:0回答:1

我在 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
总是保留最新记录还是最早记录?或者它只是随机选择一条记录来保留?

apache-spark pyspark apache-spark-sql
1个回答
0
投票

您认为使用

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()
© www.soinside.com 2019 - 2024. All rights reserved.