Scala 在Spark中使用Windows函数进行每周聚合

Scala 在Spark中使用Windows函数进行每周聚合,scala,apache-spark,dataframe,spark-graphx,Scala,Apache Spark,Dataframe,Spark Graphx,我有从2017年1月1日到2017年1月7日的数据,这是一周每周合计。我使用窗口函数的方式如下 val df_v_3 = df_v_2.groupBy(window(col("DateTime"), "7 day")) .agg(sum("Value") as "aggregate_sum") .select("window.start", "window.end", "aggregate_sum") 我有数据帧中的数据作为 DateTime,value

我有从2017年1月1日到2017年1月7日的数据,这是一周每周合计。我使用窗口函数的方式如下

val df_v_3 = df_v_2.groupBy(window(col("DateTime"), "7 day"))
      .agg(sum("Value") as "aggregate_sum")
      .select("window.start", "window.end", "aggregate_sum")
我有数据帧中的数据作为

    DateTime,value
    2017-01-01T00:00:00.000+05:30,1.2
    2017-01-01T00:15:00.000+05:30,1.30
--
    2017-01-07T23:30:00.000+05:30,1.43
    2017-01-07T23:45:00.000+05:30,1.4
我得到的输出是:

2016-12-29T05:30:00.000+05:30,2017-01-05T05:30:00.000+05:30,723.87
2017-01-05T05:30:00.000+05:30,2017-01-12T05:30:00.000+05:30,616.74

它显示我的工作日从2016年12月29日开始,但实际数据是从2017年1月1日开始,为什么会出现这种差距?

对于这样的翻滚窗口,可以设置开始时间的偏移量,更多信息可以在博客中找到。使用滑动窗口,但是,通过将“窗口持续时间”和“滑动持续时间”设置为相同的值,它将与具有起始偏移的翻滚窗口相同

语法如下所示

window(column, window duration, sliding duration, starting offset)
根据您的值,我发现64小时的偏移量将给出2017-01-01 00:00:00的开始时间

val data = Seq(("2017-01-01 00:00:00",1.0),
               ("2017-01-01 00:15:00",2.0),
               ("2017-01-08 23:30:00",1.43))
val df = data.toDF("DateTime","value")
  .withColumn("DateTime", to_timestamp($"DateTime", "yyyy-MM-dd HH:mm:ss"))

val df2 = df
  .groupBy(window(col("DateTime"), "1 week", "1 week", "64 hours"))
  .agg(sum("value") as "aggregate_sum")
  .select("window.start", "window.end", "aggregate_sum")
将给出此结果数据帧:

+-------------------+-------------------+-------------+
|              start|                end|aggregate_sum|
+-------------------+-------------------+-------------+
|2017-01-01 00:00:00|2017-01-08 00:00:00|          3.0|
|2017-01-08 00:00:00|2017-01-15 00:00:00|         1.43|
+-------------------+-------------------+-------------+

python API的解决方案看起来更加直观,因为
窗口
函数使用以下选项:
window(时间列、windowDuration、slideDuration=None、startTime=None)
见:

起始时间是相对于1970-01-01 00:00:00 UTC的偏移量 用来开始窗口间隔的。例如,为了 每小时翻滚的窗口在一小时后15分钟开始,例如。 12:15-13:15, 13:15-14:15... 提供
startTime
作为
15分钟

无需使用
滑动持续时间
的解决方法,我使用了3天的“延迟”作为
开始时间
,以匹配所需的翻滚窗口:

from datetime import datetime 
from pyspark.sql.functions import sum, window
df_ex = spark.createDataFrame([(datetime(2017,1,1, 0,0) , 1.), \
                               (datetime(2017,1,1,0,15) , 2.), \
                               (datetime(2017,1,8,23,30) , 1.43)], \
                               ["Datetime", "value"])

weekly_ex = df_ex \
            .groupBy(window("Datetime", "1 week", startTime="3 day" )) \
            .agg(sum("value").alias('aggregate_sum'))

weekly_ex.show(truncate=False)
对于相同的结果:

+------------------------------------------+-------------+
|window                                    |aggregate_sum|
+------------------------------------------+-------------+
|[2017-01-01 00:00:00, 2017-01-08 00:00:00]|3.0          |
|[2017-01-08 00:00:00, 2017-01-15 00:00:00]|1.43         |
+------------------------------------------+-------------+