如何使用Scala中的时间戳/日期列表获取事件发生的小时平均值
时间戳的示例数据如何使用Scala中的时间戳/日期列表获取事件发生的小时平均值,scala,apache-spark,apache-spark-sql,user-defined-functions,rolling-average,Scala,Apache Spark,Apache Spark Sql,User Defined Functions,Rolling Average,时间戳的示例数据 2018-04-07 07:07:17 2018-04-07 07:32:27 2018-04-07 08:36:44 2018-04-07 08:38:00 2018-04-07 08:39:29 2018-04-08 01:43:08 2018-04-08 01:43:55 2018-04-09 07:52:31 2018-04-09 07:52:42 2019-01-24 11:52:31 2019-01-24 12:52:42 2019-01-25 12:52
2018-04-07 07:07:17
2018-04-07 07:32:27
2018-04-07 08:36:44
2018-04-07 08:38:00
2018-04-07 08:39:29
2018-04-08 01:43:08
2018-04-08 01:43:55
2018-04-09 07:52:31
2018-04-09 07:52:42
2019-01-24 11:52:31
2019-01-24 12:52:42
2019-01-25 12:52:42
预期产出:
(2+3+2+2+1+3)/6=1.66
我必须每周和每月都这样做,但我可以从每小时的逻辑推断
// Iterate over each entry of a group
def update(buffer: MutableAggregationBuffer, input: Row) = {
val dateString = input(0).toString()
val dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S")
val zdt = ZonedDateTime.parse(dateString, dtf.withZone(ZoneId.systemDefault)
// zdt ZonedDateTime
我可以使用ZoneDateTime的所有方法我尝试使用下面的方法来解决- 请注意,代码在IST(GMT+5.30)中运行,因此日期 2018-04-07:07:17和 2018-04-07 07:32:27 将在不同的时间进行考虑(6:30-7:30第一次,7:30-8:30第二次) 代码
读取数据
+-------------------+
|date_time |
+-------------------+
|2018-04-07 07:07:17|
|2018-04-07 07:32:27|
|2018-04-07 08:36:44|
|2018-04-07 08:38:00|
|2018-04-07 08:39:29|
|2018-04-08 01:43:08|
|2018-04-08 01:43:55|
|2018-04-09 07:52:31|
|2018-04-09 07:52:42|
|2019-01-24 11:52:31|
|2019-01-24 12:52:42|
|2019-01-25 12:52:42|
+-------------------+
root
|-- date_time: timestamp (nullable = true)
Bucketize数据并查找每小时的计数
+-----------+-----+
|hour_bucket|count|
+-----------+-----+
|423073 |1 |
|423074 |1 |
|423075 |3 |
|423092 |2 |
|423122 |2 |
|430087 |1 |
|430086 |1 |
|430111 |1 |
+-----------+-----+
+----------+
|avg(count)|
+----------+
|1.5 |
+----------+
查找每小时平均值
+-----------+-----+
|hour_bucket|count|
+-----------+-----+
|423073 |1 |
|423074 |1 |
|423075 |3 |
|423092 |2 |
|423122 |2 |
|430087 |1 |
|430086 |1 |
|430111 |1 |
+-----------+-----+
+----------+
|avg(count)|
+----------+
|1.5 |
+----------+
希望这有帮助 为什么这个问题会得到反对票?我已经试图解决这个问题。如果这能解决你的问题,请向上投票并接受。谢谢@Someshwar。我能做些什么,val hour=60*60*24得到每日平均值吗?等等?你需要用24*60*60除法
+----------+
|avg(count)|
+----------+
|1.5 |
+----------+