#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()