Это довольно просто сделать, просто преобразовав дату и время в unix_timestamp
и взяв одно из другого. Это даст вам разницу в секундах, чтобы получить его в минутах, просто разделите на 60, а в часах просто разделите на 3600.
Я добавил логику, которая, я думаю, вам нужна для того, чтобы вычислить использование времени для каждого дня.
val df = Seq(
(2747673, "2015-01-04 23:44:03", "2015-01-05 00:00:18", 1676, "2015-01-04"),
(2747673, "2015-01-04 23:44:03", "2015-01-05 00:00:18", 1676, "2015-01-05")
).toDF("job_id", "start", "end", "nnodes", "job's day")
+-------+-------------------+-------------------+------+----------+
| job_id| start| end|nnodes| job's day|
+-------+-------------------+-------------------+------+----------+
|2747673|2015-01-04 23:44:03|2015-01-05 00:00:18| 1676|2015-01-04|
|2747673|2015-01-04 23:44:03|2015-01-05 00:00:18| 1676|2015-01-05|
+-------+-------------------+-------------------+------+----------+
val timeUsage = when(unix_timestamp(col("start"), "yyyy-MM-dd HH:mm:ss") < unix_timestamp(col("job's day"), "yyyy-MM-dd") &&
unix_timestamp(col("end"), "yyyy-MM-dd HH:mm:ss") > unix_timestamp(date_add(col("job's day"), 1), "yyyy-MM-dd"), lit(86,400))
.when(unix_timestamp(col("start"), "yyyy-MM-dd HH:mm:ss") < unix_timestamp(col("job's day"), "yyyy-MM-dd"),
unix_timestamp(col("end"), "yyyy-MM-dd HH:mm:ss") - unix_timestamp(col("job's day"), "yyyy-MM-dd"))
.when(unix_timestamp(col("end"), "yyyy-MM-dd HH:mm:ss") > unix_timestamp(date_add(col("job's day"), 1), "yyyy-MM-dd"),
unix_timestamp(date_add(col("job's day"), 1), "yyyy-MM-dd") - unix_timestamp(col("start"), "yyyy-MM-dd HH:mm:ss"))
.otherwise(unix_timestamp(col("end"), "yyyy-MM-dd HH:mm:ss") - unix_timestamp(col("start"), "yyyy-MM-dd HH:mm:ss"))
df.withColumn("difference_in_seconds", timeUsage).show
+-------+-------------------+-------------------+------+----------+---------------------+
| job_id| start| end|nnodes| job's day|difference_in_seconds|
+-------+-------------------+-------------------+------+----------+---------------------+
|2747673|2015-01-04 23:44:03|2015-01-05 00:00:18| 1676|2015-01-04| 957|
|2747673|2015-01-04 23:44:03|2015-01-05 00:00:18| 1676|2015-01-05| 18|
+-------+-------------------+-------------------+------+----------+---------------------+
df.withColumn("difference_in_minutes", timeUsage/60).show
+-------+-------------------+-------------------+------+----------+---------------------+
| job_id| start| end|nnodes| job's day|difference_in_minutes|
+-------+-------------------+-------------------+------+----------+---------------------+
|2747673|2015-01-04 23:44:03|2015-01-05 00:00:18| 1676|2015-01-04| 15.95|
|2747673|2015-01-04 23:44:03|2015-01-05 00:00:18| 1676|2015-01-05| 0.3|
+-------+-------------------+-------------------+------+----------+---------------------+