Если разница между началом и концом всегда меньше 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] |
+---------------------+---------------------+------------+
Примечание: Длябольшие различия между временными метками вышеупомянутого кода могут быть скорректированы, чтобы принять это во внимание.Затем необходимо будет посмотреть на другие поля в дополнение к часу, например, день / месяц / год.