Я работаю над оконной функцией для просмотра 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)
Спасибо.