apache-spark - 如何根据日期时间列选择 pySpark DataFrame 中的最后一个值
问题描述
我有一个结构如下的DataFrame df:
date_time id value
2020-12-06 17:00 A 10
2020-12-06 17:05 A 18
2020-12-06 17:00 B 20
2020-12-06 17:05 B 28
2020-12-06 17:00 C 30
2020-12-06 17:05 C 38
而且我必须只为名为 df_last 的 DataFrame 中的每个 id 选择最近的行。
这是一个有效的解决方案:
from pyspark.sql import functions as F
from pyspark.sql.window import *
df_rows = df.withColumn('row_num', F.row_number().over(Window.partitionBy('id').orderBy(F.desc('date_time')))-1)
df_last = df_rows.filter(F.col('row_num')==0)
我想知道是否有更简单/更清洁的解决方案
解决方案
这几乎就是这样做的方法。只需进行一些小的改进 - 无需从行号中减去 1:
from pyspark.sql import functions as F
from pyspark.sql.window import Window
df_rows = df.withColumn(
'row_num',
F.row_number().over(Window.partitionBy('id').orderBy(F.desc('date_time')))
)
df_last = df_rows.filter('row_num = 1')
推荐阅读
- angular - 在 Ionic 4 中路由到带有选项卡的页面时出错
- mysql - Increment value is not coming order wise, when GROUP BY clause uses in select query in Mysql
- mysql - 如何关闭索引合并,MySQL
- .htaccess - Htaccess 不会将 jpg/png 图像重定向到脚本以在旅途中进行 webp 转换
- java - 在 tomcat 临时文件夹锁定的情况下配置 Glowroot 显示以下异常
- reactjs - JSX 循环不渲染
- javascript - (超链接审计)的特征检测
- javascript - 通过formarray进行Mat-select不显示选定的值和选项 - 反应形式Angular
- c# - 关于使用对象处理 ArrayList 的问题
- angular - Angular 7+ 在 ngModel 上使用 CustomPipe