2017-10-06 69 views
0

我有从2017年1月1日开始到2017年1月7日的数据,这是一周需要的每周聚合。我在下面的方式使用窗函数在Spark中使用Windows函数的每周聚合

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 

这表明,我一天是从29日开始2016年12月,但实际数据是从2017年1月1日开始,为什么这个利润率发生?

+2

您可以添加关于所使用的数据的一些信息?以及你期待什么类型的结果。 – Shaido

+0

@Shaido我提供了相同的 –

+0

提供的数据似乎没有包含代码示例中使用的“DateTime”列。另外,输出与你期望的输出有什么不同? – Shaido

回答

1

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

的语法如下一样,

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| 
+-------------------+-------------------+-------------+