【问题标题】:date_add/dateadd Athena/Redshift like function for spark sql用于 spark sql 的 date_add/dateadd Athena/Redshift 类似函数
【发布时间】:2020-06-18 04:23:55
【问题描述】:

我想知道是否有任何类似于 athena/redshift date_add/dateadd 的函数可用于将毫秒添加到时间戳。例如我的时间戳值为 2020-05-12 10:23:45 并且没有毫秒部分。除了使用 INTERVAL 之外,有没有办法将毫秒添加到时间戳? 雅典娜示例

date_add('millisecond', <column-with-bigint-data>, <column-with-timestamp-data-without-millisecond>)

如果我有 2020-05-12 10:23:45 和 1115687,那么将 1115687 添加到 Athena 的上述时间戳会给我 2020-05-12 10:23:45.687

【问题讨论】:

    标签: apache-spark-sql dateadd


    【解决方案1】:

    我过去使用简单的 UDF 实现了这一点。 最好的一点是-

    • 可轻松自定义加法或减法或任何其他算术运算的逻辑
    • 由于 getTime() 返回自 1970 年 1 月 1 日以来的毫秒数,您可以使用 TimeUnit.Days.toMillis() 在天数或类似实现的情况下处理任何类型的输入。就像在这种情况下,我们将毫秒作为输入。

    代码 -

    import org.apache.spark.sql.functions.udf
    import java.util.concurrent.TimeUnit
    import java.util.Date
    import java.text.SimpleDateFormat    
    
    // Creating a UDF that takes DATE TIME & Time Interval as input 
    val datetime_add = udf((x: String, y: Int) => {
        val datetimeformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
        val result = new Date(datetimeformat.parse(x).getTime() + y)
      datetimeformat.format(result)
    } )
    //Creating a DataFrame with DateTime and 
    val df = Seq((1, "2020-05-12 10:23:45", 5000), (2, "2020-11-11 12:12:12", 2000)).toDF("id", "DateTime", "miliseconds")
    
    df.show()
    //Creating a new column which will hold the new Time i.e the added time 
    df.withColumn("new_Date", datetime_add($"DateTime", $"miliseconds")).show()
    

    输出 -

    如果这回答了您的问题,请告诉我。 重要 - 我在 Databricks 上运行这个 sn-p。

    参考资料 -

    1. https://docs.oracle.com/javase/8/docs/api/index.html?java/util/concurrent/TimeUnit.html
    2. https://www.tutorialspoint.com/java/util/date_gettime.htm

    【讨论】:

      猜你喜欢
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2014-11-20
      • 2021-11-15
      • 2022-12-14
      • 1970-01-01
      相关资源
      最近更新 更多