当前位置: 首页 > 知识库问答 >
问题:

spark scala中的运行时间戳差异

虞博涛
2023-03-14

输入DF:

main_id sub_id time
 1 .     11 .  12:00
 1 .     12     1:00
 1 .     12 .   3:00
 1 .     12 .   5:00
 1 .     13 .   7:00
 1 .     13 .   8:00
 2 .     21 .  12:00
 2 .     21     5:00

我试图找到运行时间戳的差异就main_id

输出DF:

main_id  sub_id .  time    diff
  1 .      11 .    12:00    null
  1.       12 .    1:00 .    1
  1 .      12 .    3:00 .    2
  1 .      12 .    5:00 .    2
  1 .      13 .    7:00 .    2
  1 .      13 .    8:00 .    1
  2 .      21 .   12:00 .   null
  2 .      21 .    5:00 .    5

已尝试的代码:

val needed_window = Window.partitionBy($"main_id").orderBy($"main_id")
val diff_time = diff($"time").over(partitionWindow)
df.select($"*", diff_time as "time_diff").show

我得到的差异函数的错误,有一种方法来实现这一点。任何建议请。

共有1个答案

栾钟展
2023-03-14

假设您的time列的类型为Timestamp,您可以使用unix_Timestamp和滞后窗口函数计算当前行和前一行之间的time差。

import java.sql.Timestamp
import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions.Window

val df = Seq(
  (1, 11, Timestamp.valueOf("2018-06-01 12:00:00")),
  (1, 12, Timestamp.valueOf("2018-06-01 13:00:00")),
  (1, 12, Timestamp.valueOf("2018-06-01 15:00:00")),
  (1, 12, Timestamp.valueOf("2018-06-01 17:00:00")),
  (1, 13, Timestamp.valueOf("2018-06-01 19:00:00")),
  (1, 13, Timestamp.valueOf("2018-06-01 20:00:00")),
  (2, 21, Timestamp.valueOf("2018-06-01 12:00:00")),
  (2, 21, Timestamp.valueOf("2018-06-01 17:00:00"))
).toDF("main_id", "sub_id", "time")

val window = Window.partitionBy($"main_id").orderBy($"main_id")

df.withColumn("diff",
  (unix_timestamp($"time") - unix_timestamp(lag($"time", 1).over(window))) / 3600.0
).show
// +-------+------+-------------------+----+
// |main_id|sub_id|               time|diff|
// +-------+------+-------------------+----+
// |      1|    11|2018-06-01 12:00:00|null|
// |      1|    12|2018-06-01 13:00:00| 1.0|
// |      1|    12|2018-06-01 15:00:00| 2.0|
// |      1|    12|2018-06-01 17:00:00| 2.0|
// |      1|    13|2018-06-01 19:00:00| 2.0|
// |      1|    13|2018-06-01 20:00:00| 1.0|
// |      2|    21|2018-06-01 12:00:00|null|
// |      2|    21|2018-06-01 17:00:00| 5.0|
// +-------+------+-------------------+----+
 类似资料:
  • 问题内容: 我在一个MySQL数据库表上工作,该表的列包含我对其他主机执行ping操作时的时间戳记(例如2014-09-16 09:08:05)。我的问题是如何在几分钟内计算出针对特定主机的第一次ping和最后一次ping之间的差异?另外,如何为上述差异的开始和结束指定不同的时间戳(而不是第一次和最后一次ping)。这是表格的示例: 我希望我已经对自己的解释足够清楚。 问题答案: 您可以使用本机的

  • 问题内容: 如何获得几天内两个时间戳之间的差异?我应该为此使用datetime列吗? 我将专栏切换为日期时间。简单的减法似乎并没有在几天内给我带来结果。 我不认为是几秒钟,因为当我将一天中的秒数除以(86,400)时,我不会得到一个明智的答案: 问题答案: 如果您乐于忽略列中的时间部分,则DATEDIFF()会为您提供以天为单位的时差。

  • 我将startdate和endDate作为用户的输入,将DateTime作为Flutter(Dart)中的datatype。这些字段将以时间戳格式存储在Firestore中。现在我们需要在客户端显示endDate和startDate的差异,这可以是一个实时计时器,格式为“13小时45分钟”,然后在一些分钟后,它应该是“13小时42分钟”。

  • 问题内容: 我有一个要求,我必须以小时为单位获得两个时间戳记的时差,然后才求出小时数的平均值。 我正在使用下面的查询来查找两个时间戳的差异,但它没有给出确切的结果,而是给出了近似的结果。我们还有其他解决方案吗?我的两个时间戳为(LAST_MODIFIED_DATETIME-2016-11-30 15:39:01.131 CREATE_DATETIME-2016-07-01 17:25:52.375

  • 问题内容: 我正在尝试编写一个在Oracle数据库上运行的查询。表ActionTable包含actionStartTime和actionEndTime列。我需要找出完成超过1小时的操作。 actionStartTime和actionEndTime属于时间戳类型 我有一个查询,它为我提供了执行每个操作所需的时间: 我的子句将只返回耗时超过1小时的操作,那是什么呢? 问题答案: 减去两个时间戳将返回一

  • 本文向大家介绍Android进阶之使用时间戳计算时间差,包括了Android进阶之使用时间戳计算时间差的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Android使用时间戳计算时间差的具体代码,供大家参考,具体内容如下 因当前项目需要计算时间差,进行数据处理,所以在Csdn上找了一下,之后修修补补是可以用的,建议大家如果用到项目中的话,可能需要把老的时间戳或者时间format存储在