首页 > 解决方案 > Scala-根据列值的时间戳计算总时间

问题描述

有一个 Spark 数据框,其中有一列以毫秒为单位给出状态和另一列时间。我想知道给定状态作为新数据帧的总时间是多少。

当前数据框:

TimeStamp  Status
120           Running
200           Paused
330           Running
420           Paused
450           Running
600           Stopped

现在手动观察“暂停”状态的持续时间为 200->330 和 420->450。总共 160 毫秒。所以新的数据帧将是

TotalTime     Status
160            Paused

Scala 中获取此代码的代码是什么

标签: scaladataframeapache-spark

解决方案


您可以通过以下方式使用 spark-sql 完成以下操作

  1. 创建数据的临时视图,例如
my_df.createOrReplaceTempView("my_table")
  1. 在您的 spark 会话上运行以下命令
result_df = sparkSession.sql("<insert sql below here>")
WITH durations AS (
    SELECT
         Status,
         TimeStamp,
        ((LEAD(TimeStamp,1,TimeStamp) OVER (Order by TimeStamp)) - TimeStamp) as duration
    FROM
        my_table
)
SELECT
   Status,
   SUM(duration) as TotalTime
FROM
   durations
GROUP BY
   Status

样品小提琴


推荐阅读