Объединить кадры данных и выбрать последнюю запись - PullRequest
0 голосов
/ 16 мая 2018

У меня есть 2 кадра данных.

df1:

|Timestamp                        |ProjectId|AusID|Version|
+---------------------------------+---------+-------------+
|2017-09-19 16:57:36.000642 +02:00|20034    |529  |2017   |
|2017-09-19 16:58:32.000642 +02:00|20035    |973  |2017   |
|2017-09-21 12:51:36.000642 +02:00|20034    |521  |2017   |
|2017-09-22 17:58:36.000642 +02:00|20035    |543  |2017   |

df2:

|Timestamp                        |ProjectId|AusID|Version|
+---------------------------------+---------+-------------+
|2017-09-20 08:46:17.465000 Z     |20034    |513  |2017   |
|2017-09-20 08:46:17.465000 Z     |20035    |973  |2017   |
|2017-09-21 08:46:17.465000 Z     |20034    |521  |2017   |
|2017-09-22 08:46:17.465000 Z     |20035    |587  |2017   |

Эти записив миллионах с несколькими столбцами.Я хочу объединить оба фрейма данных и удалить дубликаты, используя AusID , т.е. когда 2 записи имеют одинаковый AusID, выберите самый последний (на основе даты) и удалите другой.Другая проблема заключается в том, что даты также имеют различный формат в обоих фреймах данных .

Я попытался использовать следующий подход:

df1.union(df2).except(df1.intersect(df2)).show()  

, но, похоже, этоучитывая все столбцы.Было бы здорово, если бы кто-нибудь дал намек.

1 Ответ

0 голосов
/ 16 мая 2018

Вы можете рассмотреть следующий подход:

result = df1.unionAll(df2)
import org.apache.spark.sql.expressions._

val windowSpec = Window.partitionBy("ProjectId","AusID","Version").orderBy(col("Timestamp").asc)
val latestForEachKey = result.withColumn("rank", rank().over(windowSpec)).filter($"rank" === 1).drop("rank")
latestForEachKey.show(false)
...