【问题标题】:Compute difference between date and its previvous date计算日期与其前一个日期之间的差异
【发布时间】:2018-11-20 19:18:57
【问题描述】:

我有以下数据框:

   ---------+--------+----------+-----------+--------------------+--------------------+-------+-----+------------
|     id|groupid||              field|   oldstring|    newstring|               created|        pkey|   project     
+-------+-------+---------+--------------------+--------+-------------+--------+-------------+-------+-------+
|1451923| 594128|               Team1|    [RLA N1]|   [N1-UO-SB]|  2013-03-29 13:31:...|DSTECH-55770|   10120|
|1451958| 594140|               Team1|    [SEP N2]|     [SEP N2]|  2013-03-29 13:34:...|DSTECH-56998|   10120|   
|1452282| 594308|               Team1|  [N1-UO-SE]|     [SEP N2]|  2013-03-29 14:09:...|DSTECH-57900|   10120|    
|1492252| 610736|               Team1|  [N1-UO-SE]|     [SEP N2]|  2013-04-17 08:48:...|DSTECH-59560|   10120|
|5105082|2304145|               Team1|     [Aucun]|[SEP-SUPPORT]|  2017-09-01 09:46:...|    ECO-9781|   10280|
|5105084|2304145|               Team2|        null|  SEP-SUPPORT|  2017-09-01 09:46:...|    ECO-9781|   10280|
|5105084|2304145|               Team1|    [ISR N2]| SEP-SUPPORT | 2013-03-29 13:31:... |DSTECH-57895|   10120|
|1451926|594129 |               Team1|  [N1-UO-SE]|   [ISR N2]  |2013-03-29 13:55:...  |DSTECH-57895|   10120|
|1452182|594273 |               Team1|  [N1-UO-SE]| [SEPN1-ENV] |2013-03-29 13:43:...  |DSTECH-57895|   10120|

我想计算[pkey] 的治疗日期/时间,例如,我有这两行:

|     id|groupid||              field|   oldstring|    newstring|               created|        pkey|        
+-------+-------+---------+--------------------+--------+-------------+--------+-------------+-------+-------+
|1451923| 594128|               Team1|    [RLA N1]|   [N1-UO-SB]|  2013-03-29 13:31:...|DSTECH-55770|   
|1451958| 594140|               Team1|    [SEP N2]|     [SEP N2]|  2013-03-29 13:34:...|DSTECH-56998| 

[DSTECH-55770] = [2013-03-29 13:34:...] - [2013-03-29 13:31:...]的治疗日期/时间

如何计算与前一个日期的差异,我发现我可以使用用户定义的聚合函数 UDAF 来计算。但是,如果此解决方案对显示数字中两个日期之间的差异有用(例如:8h:30min),我并不是说 8H 是在时钟 8H,而是小时数是 8。

如果有人可以帮助我,我该如何使用 UDAF 或者您有其他解决方案?谢谢

【问题讨论】:

  • 你想过使用jodatime吗?
  • 我不认为在这种情况下,因为我会做两行之间的区别
  • 您需要对表中的每一对连续值都执行此操作吗?
  • 是的,如果我有相同的项目编号。如果你注意到我有两个字段 oldstring 和 newstring。我想根据项目编号计算每个newstring的处理时间(应该是一样的)。

标签: scala user-defined-aggregate


【解决方案1】:

可能是 SQL 窗口函数的情况。您可以找到更多详情here

我怀疑生成的代码可能类似于

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions._

val sparkSession = ...  // Create as do
import sparkSession.implicits._
// For the same project, order rows by `created` column
val partitionWindow = Window.partitionBy("project").orderBy("created".asc)
// Get me the value of `created` column in next row in a new column called datediff
val createdTimeNextRowSameProject = lead($"created",
                                         1,                   // 1 = next_row, 2 = 2 rows after, so on 
                                         "CURRENT_TIMESTAMP"  // default if next is null
                                        ).over(partitionWindow)
val dfWithTimeDiffInSeconds = df.withColumn("datediff", unix_timestamp(leadDate) - unix_timestamp($"created"))
dfWithTimeDiffInSeconds.show(10)

【讨论】:

    猜你喜欢
    • 2016-06-22
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多