另一种根据日期值获取最新记录的方法

Posted

技术标签:

【中文标题】另一种根据日期值获取最新记录的方法【英文标题】:Another way to get latest records based on date value 【发布时间】:2020-10-11 16:56:30 【问题描述】:

我有一个输入日期,但示例如下:df_inp

customer_id  |ph_num|date      |
1            |123   |2020-10-01|
2            |456   |2020-10-01|
3            |789   |2020-10-01|
1            |654   |2020-10-02|
2            |543   |2020-10-03|
1            |908   |2020-10-04|
4            |123   |2020-10-02|

我需要获取每个日常流程的最新记录。所以,我尝试了 windows rank() 操作并且它有效。但是,随着输入数据以百万计来优化性能,我们可以使用任何其他 spark 操作来获取基于 customer_id 和日期值排序的最新数据。

window_func = Window.partition_by("customer_id ").orderBy("date")
df = df.withColumn("rank", rank().over(window_func))
df = df.filter(df.rank == "1")

这里是 customer_id - 字符串和日期 - 时间戳

【问题讨论】:

【参考方案1】:

对于 Spark 3.0+,可能值得检查 max_by(或 min_by,如果您在问题中排名 1)比 window + filter 方法具有更好的性能特征。

df.groupBy("customer_id").agg(F.expr("max_by(ph_num,date)"), F.max(F.col("date")))

结果与问题中的相同。比较两种方法的执行计划,max_by 方法少了一个转换(filter),但两种方法都会触发一次交换。

【讨论】:

谢谢 我如何动态传递 groupby 列和 agg max 列?还是通过变量?? @Rocky1989 这些字符串只是普通的 Python 字符串,可以用变量替换

以上是关于另一种根据日期值获取最新记录的方法的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 mongoose 中嵌套 JSON 文档中数组字段的日志日期获取最新日志记录

SQL 查询根据日期获取最新的 3 次发送,然后对记录进行分组

SQL Server:从最大日期/最新日期的记录中获取数据

使用 group by 获取最新的日期记录

Oracle:根据不同列的值选择不同的列

按最新日期获取分组后的列