【问题标题】:Spark scala - calculating dynamic timestamp intervalSpark scala - 计算动态时间戳间隔
【发布时间】:2019-03-09 05:42:50
【问题描述】:

有一个带有时间戳列(时间戳类型)的数据框,称为“maxTmstmp”,另一个带有小时的列,以整数表示,称为“WindowHours”。 我想动态减去时间戳和整数列以获得更低的时间戳

我的数据和期望的效果(“minTmstmp”列):

+-----------+-------------------+-------------------+
|WindowHours|          maxTmstmp|          minTmstmp|
|           |                   |(maxTmstmp - Hours)|
+-----------+-------------------+-------------------+
|          1|2016-01-01 23:00:00|2016-01-01 22:00:00|
|          2|2016-03-01 12:00:00|2016-03-01 10:00:00|
|          8|2016-03-05 20:00:00|2016-03-05 12:00:00|
|         24|2016-04-12 11:00:00|2016-04-11 11:00:00|
+-----------+-------------------+-------------------+

 root
     |-- WindowHours: integer (nullable = true)
     |-- maxTmstmp: timestamp (nullable = true)

我已经找到了一个带有小时间隔解决方案的表达式,但它不是动态的。下面的代码无法按预期工作。

standards.
      .withColumn("minTmstmp", $"maxTmstmp" - expr("INTERVAL 10 HOURS"))
      .show()

在 Spark 2.4 和 scala 上运行。

【问题讨论】:

    标签: scala apache-spark dataframe


    【解决方案1】:

    一种简单的方法是将maxTmstmp转换为unix time,然后减去WindowHours的值(以秒为单位),然后将结果转换回SparkTimestamp,如下所示:

    import java.sql.Timestamp
    import org.apache.spark.sql.functions._
    import spark.implicits._
    
    val df = Seq(
      (1, Timestamp.valueOf("2016-01-01 23:00:00")),
      (2, Timestamp.valueOf("2016-03-01 12:00:00")),
      (8, Timestamp.valueOf("2016-03-05 20:00:00")),
      (24, Timestamp.valueOf("2016-04-12 11:00:00"))
    ).toDF("WindowHours", "maxTmstmp")
    
    df.withColumn("minTmstmp",
        from_unixtime(unix_timestamp($"maxTmstmp") - ($"WindowHours" * 3600))
      ).show
    // +-----------+-------------------+-------------------+
    // |WindowHours|          maxTmstmp|          minTmstmp|
    // +-----------+-------------------+-------------------+
    // |          1|2016-01-01 23:00:00|2016-01-01 22:00:00|
    // |          2|2016-03-01 12:00:00|2016-03-01 10:00:00|
    // |          8|2016-03-05 20:00:00|2016-03-05 12:00:00|
    // |         24|2016-04-12 11:00:00|2016-04-11 11:00:00|
    // +-----------+-------------------+-------------------+
    

    【讨论】:

    • 贝利西莫!如果我能够竖起三个大拇指,我会这样做。谢谢一百万,Leo C.
    猜你喜欢
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    相关资源
    最近更新 更多