Spark Scala - Дата и время до Unix_time - PullRequest
0 голосов
/ 10 апреля 2020

Я работаю над оконной функцией для просмотра 24-часовых периодов времени и вычисления минимального / максимального значения столбца за этот период и нахождения наибольшей разницы за любой 24-часовой период. Моя временная метка имеет вид: MM/dd/yyyy HH:mm a. При попытке преобразовать это время в unix правильно конвертируется только несколько значений. Вы можете заметить на токовом выходе, что некоторые 24-часовые времена начала / окончания неверны:

Т.е. 01/01/2000 1:53 PM, так как старт говорит, что 24 часа с этого момента - 01.02.2000 01: 53: AM. При проверке unixtime 946691580 для конвертера даты он отображается как 01/01/2000 1:53AM, а не PM. Так что моя проблема заключается где-то в преобразовании моего поля Date в unix_time.

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

Любые предложения о том, что я делаю неправильно?

Пример ввода (где я думаю, что мое unix время неверно):

+------------+------------------+---------+-------+-------+
|TemperatureF|              Date|timestamp|MinTemp|MaxTemp|
+------------+------------------+---------+-------+-------+
|        35.1|01/01/2000 1:53 AM|946691580|   28.0|   36.0|
|        34.0|01/01/2000 1:53 PM|946691580|   28.0|   36.0|
|        35.1|01/01/2000 2:53 AM|946695180|   28.0|   36.0|
|        33.1|01/01/2000 2:53 PM|946695180|   28.0|   36.0|
|        34.0|01/01/2000 3:53 AM|946698780|   28.0|   36.0|
|        32.0|01/01/2000 3:53 PM|946698780|   28.0|   36.0|
|        32.0|01/01/2000 4:53 AM|946702380|   28.0|   37.4|
|        32.0|01/01/2000 4:53 PM|946702380|   28.0|   37.4|
|        30.9|01/01/2000 5:53 AM|946705980|   28.0|   37.4|
+------------+------------------+---------+-------+-------+

Токовый выход

+-------------------+---------+-------------------+-------+-------+
|              Start|timestamp|                end|MinTemp|MaxTemp|
+-------------------+---------+-------------------+-------+-------+
| 01/01/2000 1:53 AM|946691580|01/02/2000 01:53 AM|   28.0|   36.0|
| 01/01/2000 1:53 PM|946691580|01/02/2000 01:53 AM|   28.0|   36.0|
| 01/01/2000 2:53 AM|946695180|01/02/2000 02:53 AM|   28.0|   36.0|
| 01/01/2000 2:53 PM|946695180|01/02/2000 02:53 AM|   28.0|   36.0|
| 01/01/2000 3:53 AM|946698780|01/02/2000 03:53 AM|   28.0|   36.0|
| 01/01/2000 3:53 PM|946698780|01/02/2000 03:53 AM|   28.0|   36.0|
| 01/01/2000 4:53 AM|946702380|01/02/2000 04:53 AM|   28.0|   37.4|
| 01/01/2000 4:53 PM|946702380|01/02/2000 04:53 AM|   28.0|   37.4|
| 01/01/2000 5:53 AM|946705980|01/02/2000 05:53 AM|   28.0|   37.4|
| 01/01/2000 5:53 PM|946705980|01/02/2000 05:53 AM|   28.0|   37.4|
| 01/01/2000 6:37 PM|946708620|01/02/2000 06:37 AM|   28.0|   37.4|
| 01/01/2000 6:53 AM|946709580|01/02/2000 06:53 AM|   28.0|   37.4|
+-------------------+---------+-------------------+-------+-------+

Текущий код:

val data = osh.select(col("TemperatureF"), concat(format_string("%02d",col("Month")),lit("/"),format_string("%02d",col("Day")),lit("/"),col("Year"),lit(" "),col("TimeCST")).as("Date")).filter(col("TemperatureF") > -9999)

val oshdata = data.withColumn("timestamp",unix_timestamp(to_timestamp(col("Date"),"MM/dd/yyyy HH:mm")))

import org.apache.spark.sql.expressions._
val myWindow = Window.orderBy("timestamp").rangeBetween(Window.currentRow, 86400)
val myData = oshdata.withColumn("MinTemp", min(col("TemperatureF")).over(myWindow))
  .withColumn("MaxTemp",max(col("TemperatureF")).over(myWindow))

  myData.show()

myData.createOrReplaceTempView("oshView")


spark.sqlContext.sql("Select Date as Start,timestamp, from_unixtime(timestamp+86400,'MM/dd/yyyy HH:mm a') as end,MinTemp,MaxTemp from oshView").show(25)

Спасибо.

Ответы [ 3 ]

3 голосов
/ 10 апреля 2020

Вы анализируете столбец Date, используя "MM/dd/yyyy HH:mm", поэтому он игнорирует маркер am / pm. Вместо этого вы должны использовать MM/dd/yyyy hh:mm a. Обратите внимание, что это hh для 12-часовых значений времени, а не HH.

1 голос
/ 10 апреля 2020

Разобрался. Необходимо обновить MM/dd/yyyy HH:mm a, чтобы получить MM/dd/yyyy hh:mm a.

Вывод:

+-------------------+---------+-------------------+-------+-------+
|              Start|timestamp|                end|MinTemp|MaxTemp|
+-------------------+---------+-------------------+-------+-------+
|01/01/2000 12:53 AM|946687980|01/02/2000 12:53 AM|   28.0|   36.0|
| 01/01/2000 1:53 AM|946691580|01/02/2000 01:53 AM|   28.0|   36.0|
| 01/01/2000 2:53 AM|946695180|01/02/2000 02:53 AM|   28.0|   36.0|
| 01/01/2000 3:53 AM|946698780|01/02/2000 03:53 AM|   28.0|   36.0|
| 01/01/2000 4:53 AM|946702380|01/02/2000 04:53 AM|   28.0|   37.4|
| 01/01/2000 5:53 AM|946705980|01/02/2000 05:53 AM|   28.0|   37.4|
| 01/01/2000 6:53 AM|946709580|01/02/2000 06:53 AM|   28.0|   37.4|
| 01/01/2000 7:53 AM|946713180|01/02/2000 07:53 AM|   28.0|   37.4|
| 01/01/2000 8:53 AM|946716780|01/02/2000 08:53 AM|   28.0|   37.4|
+-------------------+---------+-------------------+-------+-------+
0 голосов
/ 10 апреля 2020

Это, вероятно, сводится к тому, что ваш разбор времени неверен:

unix_timestamp(to_timestamp($"Date", "MM/dd/yyyy hh:mm a"))
...