выберите последнюю запись из фрейма данных spark

#apache-spark-sql

#apache-spark-sql

Вопрос:

у меня DataDrame выглядит так:

  ------- --------- 
|email  |timestamp|
 ------- --------- 
|x@y.com|        1|
|y@m.net|        2|
|z@c.org|        3|
|x@y.com|        4|
|y@m.net|        5|
|    .. |       ..|
 ------- --------- 
  

для каждого электронного письма я хочу сохранить последнюю запись, чтобы результат был:

  ------- --------- 
|email  |timestamp|
 ------- --------- 
|x@y.com|        4|
|y@m.net|        5|
|z@c.org|        3|
|    .. |       ..|
 ------- --------- 
  

как я могу это сделать? я новичок в spark и dataframe.

Ответ №1:

Вот общий SQL-запрос ANSI, который должен работать с Spark SQL:

 SELECT email, timestamp
FROM
(
    SELECT t.*, ROW_NUMBER() OVER (PARTITION BY email ORDER BY timestamp DESC) rn
    FROM yourTable t
) t
WHERE rn = 1;
  

Для кода фрейма данных PySpark попробуйте выполнить следующее:

 from pyspark.sql.window import Window

df = yourDF
    .withColumn("rn", F.row_number()
        .over(Window.partitionBy("email")
        .orderBy(F.col("timestamp").desc())))

df = df.filter(F.col("rn") == 1).drop("rn")
df.show()