python - Pyspark:如何根据另一个数据帧中的日期将另一个值应用于数据帧值
问题描述
我有我的第一个数据框df
包含start_date
和值,我的第二个数据框df_v
只包含日期。
我的df
:
+-------------------+-----+
| start_date |value|
+-------------------+-----+
|2019-03-17 00:00:00| 35|
+-------------------+-----+
|2019-05-20 00:00:00| 40|
+-------------------+-----+
|2019-06-03 00:00:00| 10|
+-------------------+-----+
|2019-07-01 00:00:00| 12|
+-------------------+-----+
我的df_v
:
+-------------------+
| date |
+-------------------+
|2019-02-01 00:00:00|
+-------------------+
|2019-04-10 00:00:00|
+-------------------+
|2019-06-14 00:00:00|
+-------------------+
我想要的是新的df_v
:
+-------------------+-------------+
| date | v_value |
+-------------------+-------------+
|2019-02-01 00:00:00| 0|
+-------------------+-------------+
|2019-04-10 00:00:00| (0+35) 35|
+-------------------+-------------+
|2019-06-14 00:00:00|(35+40+10) 85|
+-------------------+-------------+
尝试像这样工作:
df=df.withColumn("lead",lead(F.col("start_date"),1).over(Window.orderBy("start_date")))
for r_v in df_v.rdd.collect():
for r in df.rdd.collect():
if (r_v.date >= r.start_date) and (r_v.date < r.lead):
df_v = df_v.withColumn('v_value',
...
解决方案
这可以通过 ajoin
和 a 聚合来完成。
from pyspark.sql.functions import sum,when
#Join
joined_df = df_v.join(df,df.start_date <= df_v.date,'left')
joined_df.show() #View the joined result
#Aggregation
joined_df \
.groupBy(joined_df.date) \
.agg(sum((when(joined_df.value.isNull(),0).otherwise(joined_df.value))).alias('val')) \
.show()
推荐阅读
- mechanicalturk - 我在哪里可以找到“HTMLQuestion 架构 URL”和 CDATA(新手......用完了选项)
- spring - Spring Boot:无法从 yaml 读取对象列表
- python - Pyspark:获取列的最常见值?
- c# - 无法正确获取 F# 库中派生的类型的实例
- laravel - Laravel 查看不同设计的文件夹结构
- javascript - Heroku 应用出现奇怪的控制台消息
- java - 如何在不使用任何字符串方法且不导入的情况下确定填充字符串的字符列表的长度
- javascript - 如何为随机内容制作 tabBar 元素?
- swift - 如何使用手机默认摄像头
- java - Spock框架中的模拟