我的数据框为-df.show(5)
:
col1,date
1,2018
1,2019
2,2019
2,2018
3,2019
并且只想保留每个组的最新记录。所需的结果将是:
col1,date
1,2019
2,2019
3,2019
如何实现? 谢谢。
答案 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|
+----+----------+