Scala 在Spark中使用Windows函数进行每周聚合
我有从2017年1月1日到2017年1月7日的数据,这是一周每周合计。我使用窗口函数的方式如下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
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 |
+------------------------------------------+-------------+