Сохранить последнюю строку после groupBy scala spark - PullRequest
2 голосов
/ 29 октября 2019

У меня есть dataFrame, как это:

+--------+----------+-------------------+------+---------------+
|      ID|      DATE|               TIME|  COL1|           COL2|
+--------+----------+-------------------+------+---------------+
|21763789|2019-08-29|2019-08-29 17:08:06|  1   |            USA|
|29211238|2019-08-27|2019-08-27 11:04:42|  1   |          SPAIN|
| 1696884|2019-08-10|2019-08-10 21:07:57|  1   |         ITALIA|
|  211801|2019-08-06|2019-08-06 20:42:25|  1   |          SPAIN|
|20183201|2019-08-07|2019-08-07 16:59:09|  5001|          SPAIN|
|21763789|2019-08-27|2019-08-27 10:14:38|  1   |            USA|
|29211238|2019-08-14|2019-08-14 09:39:09|  1   |         ITALIA|
|20183201|2019-08-19|2019-08-19 21:30:29|  5001|            USA|
|29211238|2019-08-23|2019-08-23 19:00:25|  1   |            USA|
|  211801|2019-08-22|2019-08-22 05:22:28|  1   |            USA|
|  211801|2019-08-28|2019-08-28 11:58:33|  1   |         ITALIA|
|25648097|2019-08-30|2019-08-30 15:10:22|  2   |          SPAIN|
|29211238|2019-08-27|2019-08-27 11:04:44|  1   |          SPAIN|
|26295227|2019-08-25|2019-08-25 00:08:22|  1   |            USA|
|21763789|2019-08-20|2019-08-20 13:04:34|  1   |          SPAIN|
| 1696884|2019-08-23|2019-08-23 09:27:50|  1   |         ITALIA| 
| 6209818|2019-08-03|2019-08-03 14:52:25|  1   |         ITALIA|
|26295227|2019-08-21|2019-08-21 12:46:58|  1   |            USA|
|29211238|2019-08-22|2019-08-22 17:46:42|  1   |            USA|
|21763789|2019-08-07|2019-08-07 13:02:18|  1   |          SPAIN|
+--------+----------+-------------------+------+---------------+

Я хочу сгруппировать этот dataFrame по ID и DATE, а затем я хочу сохранить только самую последнюю строку в столбце TIME:

df.groupBy (col ("ID"), col ("DATE")). agg (min (col ("TIME"))) Возможно, это работает, но у меня есть много других столбцов, тогда, возможно, моя агрегация сломает их?

val onlyRecent = Window.partitionBy (col ("ID"), col ("DATE")). OrderBy (col ("TIME")) Я не знаю, может ли это быть полезным.

Есть идеи, пожалуйста? Спасибо

1 Ответ

2 голосов
/ 29 октября 2019

Вы находитесь на правильном пути с оконной функцией. По сути, вы хотите «пометить» запись, чтобы как-то ее сохранить, а затем отфильтровать по этой метке. Какая функция метки вы используете, полностью зависит от того, что вы хотите делать с дублированием в столбце TIME. Следующее выберет одну из «связанных» записей (фактически в случайном порядке).

val w = Window.partitionBy($"ID", $"DATE").orderBy($"TIME".desc)

df.withColumn("rank", row_number().over(w)).where($"rank" === 1).drop("rank")

Если вы хотите сохранить обе записи в случае «связи», используйте либо rank(), либо dense_rank() вместо row_number().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...