从 spark 数据框中选择最新记录

Posted

技术标签:

【中文标题】从 spark 数据框中选择最新记录【英文标题】:select latest record from spark dataframe 【发布时间】:2019-04-10 14:57:56 【问题描述】:

我的 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】:

这是一个通用的 ANSI SQL 查询,应该可以与 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()

【讨论】:

以上是关于从 spark 数据框中选择最新记录的主要内容,如果未能解决你的问题,请参考以下文章

如何从具有最后时间戳的数据框中选择不同的记录

从数据框中获取最新响应

SQLite:如何使用复合键从单个表中选择“每个用户的最新记录”?

从 Oracle 中选择最新的两条不同记录

如何从创建的列中选择最新记录

使用 Spark Scala 为数据中的每个组选择窗口操作后的最新时间戳记录