Существует несколько агрегатных функций окна, таких как ...
rank
, dense_rank
, percent_rank
, ntile
, row_number
см. Документы базы данных
вы должны использовать row_number
из этого согласно требованию читать документы и различия.
val window = Window.partitionBy($"id").orderBy($"dt2", $"dt1" desc)
data.withColumn("rownumber", row_number().over(window))
.filter($"rownumber" === 1)
.drop("rownumber")
.show(false)
}
Результат:
+---+----+----------+----------+
|id |code|dt1 |dt2 |
+---+----+----------+----------+
|c |qq |2020-02-21|2020-03-09|
|b |ww |2020-01-05|2020-02-25|
|a |xy |2020-01-01|2020-02-01|
+---+----+----------+----------+
Чтобы лучше понять row_number, rank и density_rank посмотрите это,
data
.withColumn("rank", rank().over(window))
.withColumn("dense_rank", dense_rank().over(window))
.withColumn("row_number", row_number().over(window))
.show()
+---+----+----------+----------+----+----------+----------+
| id|code| dt1| dt2|rank|dense_rank|row_number|
+---+----+----------+----------+----+----------+----------+
| c| qq|2020-02-21|2020-03-09| 1| 1| 1|
| c| rr|2020-02-21|2020-03-09| 1| 1| 2|
| b| nn|2020-01-04|2020-02-25| 1| 1| 1|
| b| ww|2020-01-05|2020-02-25| 2| 2| 2|
| a| xy|2020-01-01|2020-02-01| 1| 1| 1|
| a| du|2020-01-04|2020-02-07| 2| 2| 2|
| a| xx|2020-01-01|2020-03-01| 3| 3| 3|
+---+----+----------+----------+----+----------+----------+
В вашем where
состоянии у вас есть 4 строки с одинаковым рангом 1, поэтому вы получаете 4 строки.