【发布时间】:2020-05-15 21:45:34
【问题描述】:
我试图让一个窗口函数返回并在特定日期之前获取上一行,我不太确定出了什么问题,但它给了我上一行而不是指定的日期行。为了计算这一点,我正在获取当前行日期并找到与该周相关的当前星期一
def previous_day(date, dayOfWeek):
return date_sub(next_day(date, "monday"), 7)
spark_df = spark_df.withColumn("last_monday", previous_day(spark_df['calendarday'], "monday"))
然后我正在计算当天与最近的前一个星期一之间的差异(以天为单位)
d = F.datediff(spark_df['calendarday'], spark_df['last_monday'])
spark_df = spark_df.withColumn("daysSinceMonday",d)
从我的 daysSinceMonday 中可以看出,每行的值都是正确的。接下来我想创建一个窗口并选择它的第一行,但将它们按我设置的 d 值进行范围,但由于某种原因它不起作用。
days = lambda i: i * 86400
w = (Window.partitionBy(column_list).orderBy(col('calendarday').cast("timestamp").cast("long")).rangeBetween(-days(d), 0))
spark_df = spark_df.withColumn('PreviousYearUnique', first("indexCP").over(w))
Starting Data Frame
## +---+-----------+-----------+--------+
## | id|calendarday|last_monday| indexCP|
## +---+-----------+-----------+--------+
## | 1|2015-01-05 | 2015-01-05| 0.0076|
## | 1|2015-01-06 | 2015-01-05| 0.0026|
## | 1|2015-01-07 | 2015-01-05| 0.0016|
## | 1|2015-01-08 | 2015-01-05| 0.0006|
## | 2|2015-01-09 | 2015-01-05| 0.0012|
## | 2|2015-01-10 | 2015-01-05| 0.0014|
## | 1|2015-01-12 | 2015-01-12| 0.0026|
## | 1|2015-01-13 | 2015-01-12| 0.0086|
## | 1|2015-01-14 | 2015-01-12| 0.0046|
## | 1|2015-01-15 | 2015-01-12| 0.0021|
## | 2|2015-01-16 | 2015-01-12| 0.0042|
## | 2|2015-01-17 | 2015-01-12| 0.0099|
## +---+-----------+-----------+--------+
New Data Frame Adding Previous last_mondays row indexCP as PreviousYearUnique
## +---+-----------+-----------+--------+--------------------+
## | id|calendarday|last_monday| indexCP| PreviousYearUnique |
## +---+-----------+-----------+--------+--------------------+
## | 1|2015-01-05 | 2015-01-05| 0.0076| 0.0076|
## | 1|2015-01-06 | 2015-01-05| 0.0026| 0.0076|
## | 1|2015-01-07 | 2015-01-05| 0.0016| 0.0076|
## | 1|2015-01-08 | 2015-01-05| 0.0006| 0.0076|
## | 2|2015-01-09 | 2015-01-05| 0.0012| 0.0076|
## | 2|2015-01-10 | 2015-01-05| 0.0014| 0.0076|
## | 1|2015-01-12 | 2015-01-12| 0.0026| 0.0026|
## | 1|2015-01-13 | 2015-01-12| 0.0086| 0.0026|
## | 1|2015-01-14 | 2015-01-12| 0.0046| 0.0026|
## | 1|2015-01-15 | 2015-01-12| 0.0021| 0.0026|
## | 2|2015-01-16 | 2015-01-12| 0.0042| 0.0026|
## | 2|2015-01-17 | 2015-01-12| 0.0099| 0.0026|
## +---+-----------+-----------+--------+--------------------+
有什么想法吗?
【问题讨论】:
-
如果您可以以表格格式提供示例数据和所需的输出,这将有助于人们回答。(欢迎使用 SO)
-
好点添加了它们。感谢这是一个整洁的地方!
标签: python apache-spark pyspark aws-glue