Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PySpark窗口函数,用于获取日期列值等于日期的最后一行_Python_Apache Spark_Pyspark_Aws Glue - Fatal编程技术网

Python PySpark窗口函数,用于获取日期列值等于日期的最后一行

Python PySpark窗口函数,用于获取日期列值等于日期的最后一行,python,apache-spark,pyspark,aws-glue,Python,Apache Spark,Pyspark,Aws Glue,我试图让一个窗口函数返回并在特定日期前获取前一行,但不确定出了什么问题,但它给我的是前一行,而不是指定的日期行。为了计算这一点,我取当前行的日期,并查找与该周相关的当前星期一,如下所示 def previous_day(date, dayOfWeek): return date_sub(next_day(date, "monday"), 7) spark_df = spark_df.withColumn("last_monday", previous_day(sp

我试图让一个窗口函数返回并在特定日期前获取前一行,但不确定出了什么问题,但它给我的是前一行,而不是指定的日期行。为了计算这一点,我取当前行的日期,并查找与该周相关的当前星期一,如下所示

    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|
    ## +---+-----------+-----------+--------+--------------------+
你知道哪里出了问题吗?

你可以在日历日的最后一个星期一在一个无限的窗口中进行分区,然后先使用

您可以在日历日的最后一个星期一,在一个无限的弹出窗口中进行分区,然后使用第一个


如果您能以表格格式提供示例数据和所需输出,这将有助于人们回答。欢迎使用SOgood point添加它们。谢谢,这是个整洁的地方!如果您能以表格格式提供示例数据和所需输出,这将有助于人们回答。欢迎使用SOgood point添加它们。谢谢,这是个整洁的地方!数据中总共有40列,为了便于查看,我刚刚对其进行了缩减。它当前必须是partitionBycolumn_list,定义为column_list=[accountname,secname]当然,你只需将上周一添加到列u列表中,然后首先使用window shownok进行计算,我会尝试一下,但我认为对于id:1日历日:2015-01-15上周一:2015-01-12,它将给我| 1 | 2015-01-05 | 2015-01-05 | 0.0076 | 0.0076 |,但我需要的行是| 1 | 2015-01-12 | 2015-01-12 | 0.0026 |0.0026 |看起来确实有效。我不明白它为什么有效,但它确实有效!谢谢数据中总共有40列,为了便于查看,我刚刚对其进行了缩减。它当前必须是partitionBycolumn_list,定义为column_list=[accountname,secname]当然,你只需将上周一添加到列u列表中,然后首先使用window shownok进行计算,我会尝试一下,但我认为对于id:1日历日:2015-01-15上周一:2015-01-12,它将给我| 1 | 2015-01-05 | 2015-01-05 | 0.0076 | 0.0076 |,但我需要的行是| 1 | 2015-01-12 | 2015-01-12 | 0.0026 |0.0026 |看起来确实有效。我不明白它为什么有效,但它确实有效!谢谢
from pyspark.sql import functions as F
from pyspark.sql.window import Window

w=Window().partitionBy("last_monday")\
          .orderBy(F.to_date("calendarday","yyyy-MM-dd"))\
          .rowsBetween(Window.unboundedPreceding,Window.currentRow)

df.withColumn("PreviousYearUnique", F.first("indexCP").over(w)).show()


#+---+-----------+-----------+-------+------------------+
#| 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| 6.0E-4|            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|
#+---+-----------+-----------+-------+------------------+