【问题标题】:How to create a sequence of timestamps in Scala如何在 Scala 中创建时间戳序列
【发布时间】:2022-01-22 19:07:15
【问题描述】:

正如问题所说,我的目标是在 Scala(在 Spark 应用程序上)中创建以 每小时 间隔从某个时间戳到另一个时间戳定义的时间戳序列,然后将此序列转换为DataFrame。 比如下面两个时间戳

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

我想获得从start_tsend_ts 的所有时间的一列(Date)的输出DataFrame,即

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

【问题讨论】:

  • 那么...你尝试了什么?它看起来不是一个难题。困扰您的具体问题是什么?是将其分配给所有工作节点还是其他?
  • 我的问题是我是 Scala 的新手,在文档中我没有找到在两个时间戳之间创建每小时间隔的函数
  • 我使用 JodaTime 的旧答案可能会有所帮助。将 fromto DateTime 实例和 Period 更改为一小时。然后将Iterator 转换为DataFrame stackoverflow.com/questions/17690739/…
  • 如果您使用的是 spark 2.4+,请检查内置函数:explode + sequence:spark.apache.org/docs/2.4.0/api/sql/index.html#sequence

标签: scala apache-spark date apache-spark-sql timestamp


【解决方案1】:

对于 Spark 2.4+,您可以通过使用 interval 1 hour 设置 step 参数来对数组使用 sequence 函数:

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|
+-------------------+

【讨论】:

    【解决方案2】:

    你可以试试这个:输入两个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

    【讨论】:

    • 请不要教年轻人使用早已过时且臭名昭著的SimpleDateFormat类。至少不是第一选择。而且不是没有任何保留。今天我们在java.time, the modern Java date and time API, 和它的DateTimeFormatter 中做得更好。
    猜你喜欢
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 2021-02-25
    • 2018-08-16
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    相关资源
    最近更新 更多