Как создать последовательность отметок времени в Scala - PullRequest
0 голосов
/ 06 февраля 2020

Как следует из вопроса, моя цель состоит в том, чтобы создать в Scala (в приложении Spark) последовательность отметок времени, определенных с интервалом ежечасно от одной отметки времени к другой, и затем преобразовать эту последовательность до DataFrame. Например, со следующими двумя временными метками

val start_ts = "2019-11-20 00:00:00"
val end_ts = "2019-11-25 23:00:00"

я хотел бы получить вывод DataFrame одного столбца (Date) со всеми часами от start_ts до end_ts, т.е. 1011 *

Date
2019-11-20 00:00:00
2019-11-20 01:00:00
2019-11-20 02:00:00
...
2019-11-25 21:00:00
2019-11-25 22:00:00
2019-11-25 23:00:00

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Для Spark 2.4+ вы можете использовать функцию sequence для массивов, установив параметр шага с помощью interval 1 hour:

val df = spark.sql("SELECT sequence(to_timestamp('2019-11-20 00:00:00'), to_timestamp('2019-11-25 23:00:00'), interval 1 hour) as Date")

df.printSchema()

//root
// |-- Date: array (nullable = true)
// |    |-- element: timestamp (containsNull = false)

Теперь просто взорвите массив временные метки, чтобы получить желаемый результат:

df.withColumn("Date", explode($"Date")).show(5)

+-------------------+
|               Date|
+-------------------+
|2019-11-20 00:00:00|
|2019-11-20 01:00:00|
|2019-11-20 02:00:00|
|2019-11-20 03:00:00|
|2019-11-20 04:00:00|
+-------------------+
1 голос
/ 06 февраля 2020

вы можете попробовать это: введите два String => Выходной Итератор localDateTime

def dayIterator(start_ts: String, end_ts: String) = {
            val format = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:SS")
            val date_start = format.parse(start_ts)
            val date_end = format.parse(end_ts)
            val start = LocalDateTime.ofInstant(Instant.ofEpochMilli(date_start.getTime), ZoneId.systemDefault)
            val last = LocalDateTime.ofInstant(Instant.ofEpochMilli(date_end.getTime), ZoneId.systemDefault)

            Iterator.iterate(start)(_ plusHours 1) takeWhile (_ isEqual last)
        }

И из этого Итератора вы можете создать DataFrame

...