Spark Dataframe, получить продолжительность между двумя датами в часах и разбить их на каждый день - PullRequest
0 голосов
/ 12 марта 2019

У меня относительно большой набор данных, в котором есть записи о заданиях, отправляемых в очередь.[часть] этих записей имеют начало и конец времени выполнения задания и сколько ресурсов (как здесь nnodes) они потребляли.

Что я могу сделать, это создать новую строку для каждого дня каждого дняработа.Я хочу также узнать, сколько часов в каждый из этих дней эта работа использовала для этих ресурсов.

+-------+-------------------+-------------------+------+----------+
| job_id|              start|                end|nnodes| job's day|
+-------+-------------------+-------------------+------+----------+
|2747673|2015-01-04 23:44:03|2015-01-05 00:13:18|  1676|2015-01-04|
|2747673|2015-01-04 23:44:03|2015-01-05 00:13:18|  1676|2015-01-05|
+-------+-------------------+-------------------+------+----------+

Кажется, это должно быть простым делом, но мне нужно получитьколичество дней для каждой работы.Если ответ один - простое сокращение, но для любого большего числа не все так просто.Интересно, есть ли типичное решение для этого.Как следует предположить, не все месяцы равны.

ps Я хочу подчеркнуть, что мне нужны часы или минуты для каждой записи.Поэтому первая строка должна быть:

+-------+-------------------+-------------------+------+----------+--------+
| job_id|              start|                end|nnodes| job's day| minutes|
+-------+-------------------+-------------------+------+----------+--------+
|2747673|2015-01-04 23:44:03|2015-01-05 00:13:18|  1676|2015-01-04|      46|
|2747673|2015-01-04 23:44:03|2015-01-05 00:13:18|  1676|2015-01-05|      13|
+-------+-------------------+-------------------+------+----------+--------+

и т. Д.

1 Ответ

1 голос
/ 12 марта 2019

Это довольно просто сделать, просто преобразовав дату и время в 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|
+-------+-------------------+-------------------+------+----------+---------------------+                    
...