gpt4 book ai didi

apache-spark - Spark SQL : Aggregate with time window

转载 作者:行者123 更新时间:2023-12-02 03:08:18 25 4
gpt4 key购买 nike

我有按时间戳排序的数据,其结构如下:

+------------+--------+--------+----------+-------+
| timestamp | value | device | subgroup | group |
+------------+--------+--------+----------+-------+
| 1377986440 | 0 | 1 | 0 | 5 |
| 1377986440 | 2.25 | 1 | 0 | 5 |
| 1377986440 | 0 | 2 | 0 | 6 |
| 1377986440 | 0.135 | 0 | 0 | 6 |
| 1377986440 | 0.355 | 0 | 0 | 6 |
+------------+--------+--------+----------+-------+

我已经将时间戳从 Long 更改为 TimestampType,并且记录从 2013 年 9 月 1 日到 2013 年 9 月 30 日。

我需要计算整个数据集值的平均值和标准差到以下时间窗口:[00:00, 6:00), [06:00,12:00), [12:00, 18] :00), [18:00,00:00) 以及每组。例如,输出应该是这样的:

+-------+--------------+------+-------+
| group | timeSlot | avg | std |
+-------+--------------+------+-------+
| 0 | 00:00 6:00 | 1.4 | 0.25 |
| 0 | 06:00 12:00 | 2.4 | 0.25 |
| ... | ... | .... | .... |
| 3 | 00:00 6:00 | 2.3 | 0.1 |
| 3 | 06:00 12:00 | 0.0 | 0.0 |
| ... | ... | ... | ... |
+-------+--------------+------+-------+

我尝试使用窗口如何解释here所以我将 Unix 时间戳转换为 TimestampType,格式为 HH:mm:ss。那么我的代码是:

val data = df
.select("*")
.withColumn("timestamp", from_unixtime($"timestamp", "HH:mm:ss"))

val res = data.select("*")
.groupBy($"group", window($"timestamp", "6 hours", "6 hours"))
.agg(avg("value"), stddev("value"))
.orderBy("group")

但是,如果我没有指定窗口的起始点,第一个时间段不会从 00:00 开始,而是从 02:00:00 开始。我得到的输出是:

+--------+------------------------------------------+---------------------+---------------------+
|group |window |avg(cons) |stddev_samp(cons) |
+--------+------------------------------------------+---------------------+---------------------+
|0 |[2018-05-18 02:00:00, 2018-05-18 08:00:00]|1.781448366186445E-4 |0.004346229072242386 |
|0 |[2018-05-18 14:00:00, 2018-05-18 20:00:00]|0.0045980360360061865|0.7113464184007158 |
|0 |[2018-05-18 20:00:00, 2018-05-19 02:00:00]|2.7686190915763437E-4|6.490469208721791E-4 |
|0 |[2018-05-17 20:00:00, 2018-05-18 02:00:00]|0.0016399597206953798|0.12325297254169619 |
|0 |[2018-05-18 08:00:00, 2018-05-18 14:00:00]|2.3354306613988956E-4|5.121337883543223E-4 |
|1 |[2018-05-18 20:00:00, 2018-05-19 02:00:00]|8.319111249637333E-4 |0.00163300686441327 |
|1 |[2018-05-18 14:00:00, 2018-05-18 20:00:00]|0.006463708881068344 |0.7907138759032012 |
|1 |[2018-05-18 02:00:00, 2018-05-18 08:00:00]|6.540241054052753E-4 |0.020490123866864617 |

我应该如何更改我的代码?我尝试过其他解决方案,但没有任何效果

最佳答案

您可能错误配置了时区设置。两小时轮类建议您使用 GMT+2 或同等时间。

如果您使用 Spark 2.3(或更高版本),您只需在代码(或配置)中设置时区即可:

spark.conf.set("spark.sql.session.timeZone", "UTC")

关于apache-spark - Spark SQL : Aggregate with time window,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50407636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com