如何计算两个时间戳之间的活跃小时数

时间:2018-05-17 06:38:21

标签: apache-spark dataframe timestamp apache-spark-sql

如果我的数据框有两个Timestamps,称为“开始”和“结束”,如何计算“开始”和“结束”之间所有小时的列表?

另一个说这可能是“记录活跃的时间”?

例如:

// Input
|              start|                end|
|2017-06-01 09:30:00|2017-06-01 11:30:00|
|2017-06-01 14:00:00|2017-06-01 14:30:00|

// Result
|              start|                end|hours_active|
|2017-06-01 09:30:00|2017-06-01 11:30:00|   (9,10,11)|
|2017-06-01 14:00:00|2017-06-01 14:30:00|        (14)|

由于

1 个答案:

答案 0 :(得分:1)

如果开始和结束之间的差异始终小于24小时,则可以使用以下UDF。假设列的类型为Timestamp

val getActiveHours = udf((s: Long, e: Long) => {
  if (e >= s) {
    val diff = e - s
    (s to (s+diff)).toSeq
  } else {
    // the end is in the next day
    (s to 24).toSeq ++ (1L to e).toSeq 
  }
})

df.withColumn("hours_active", getActiveHours(hour($"start"), hour($"end")))

使用问题中的示例数据给出:

+---------------------+---------------------+------------+
|start                |end                  |hours_active|
+---------------------+---------------------+------------+
|2017-06-01 09:30:00.0|2017-06-01 11:30:00.0|[9, 10, 11] |
|2017-06-01 14:00:00.0|2017-06-01 14:30:00.0|[14]        |
+---------------------+---------------------+------------+

注意:对于时间戳之间的较大差异,可以调整上述代码以将其考虑在内。然后有必要查看除小时之外的其他字段,例如日/月/年。