如何使用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       |
    +----------+