Pyspark数据框-如何为每个组仅选择最新记录?

时间:2020-02-25 18:31:58

标签: dataframe apache-spark pyspark

我的数据框为-df.show(5)

col1,date
1,2018
1,2019
2,2019
2,2018
3,2019

并且只想保留每个组的最新记录。所需的结果将是:

col1,date
1,2019
2,2019
3,2019

如何实现? 谢谢。

1 个答案:

答案 0 :(得分:1)

我认为,如果两行具有相同的日期,那么使用 row_number() 窗口功能将为您提供所需的结果,那么row_number仅选择一行!

Using row_number():

from pyspark.sql.window import Window
from pyspark.sql.functions import *
w =  row_number().over(Window.partitionBy("col1").orderBy(col("date").desc()))

df=sc.parallelize([('1','2018'),('1','2019'),('1','2019'),('2','2019'),('2','2018'),('3','2019')]).toDF(['col1','date']).withColumn("date",col("date").cast("Date"))

df.withColumn("rn",w).filter(col("rn") == 1).drop("rn").show()
+----+----------+
|col1|      date|
+----+----------+
|   3|2019-01-01|
|   1|2019-01-01|
|   2|2019-01-01|
+----+----------+

如果需要同时选择两行,请使用 rank() 窗口功能!

Using rank():

w =  rank().over(Window.partitionBy("col1").orderBy(col("date").desc()))
df.withColumn("rn",w).filter(col("rn") == 1).drop("rn").show()

+----+----------+
|col1|      date|
+----+----------+
|   3|2019-01-01|
|   1|2019-01-01|
|   1|2019-01-01|
|   2|2019-01-01|
+----+----------+