Найти отличную строку на основе критерия даты - PullRequest
1 голос
/ 22 апреля 2020

Для приведенного ниже фрейма данных мне нужно найти одну строку для идентификаторов, поскольку идентификаторы дублируются. Вот логи c, чтобы получить одну строку

  • Получить строку с max dt2
  • Если dt2 совпадают, получить строку с max dt1
  • Если dt2 и dt1 одинаковы: получают 1 случайную строку DT1 и DT2 ценят любую помощь!

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

Существует несколько агрегатных функций окна, таких как ...

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 строки.

0 голосов
/ 22 апреля 2020
val byId = Window.partitionBy($"id").orderBy($"dt2", $"dt1" desc)
val idByMaxdate = data.select('*, rank().over(byId) as 'rank).where($"rank" === 1).drop("rank")
idByMaxdate.show()


+---+----+----------+----------+
| id|code|       dt1|       dt2|
+---+----+----------+----------+
|  c|  qq|2020-02-21|2020-03-09|
|  c|  rr|2020-02-21|2020-03-09|
|  b|  ww|2020-01-05|2020-02-25|
|  a|  xy|2020-01-01|2020-02-01|
+---+----+----------+----------+

Получил это далеко, но не уверен, как получить только одну строку для идентификаторов, которые имеют одинаковые dt1 и dt2, ценят любую помощь!

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