spark scala中的运行时间戳差异
Posted
技术标签:
【中文标题】spark scala中的运行时间戳差异【英文标题】:running timestamp difference in spark scala 【发布时间】:2018-06-19 00:30:24 【问题描述】:输入 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
我在 diff 函数中遇到错误,有没有办法实现这个。请有任何建议。
【问题讨论】:
你能分享你的输入数据框的架构吗? 【参考方案1】:假设您的time
列是Timestamp
类型,您可以使用unix_timestamp
和lag Window 函数计算当前行与上一行之间的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|
// +-------+------+-------------------+----+
【讨论】:
以上是关于spark scala中的运行时间戳差异的主要内容,如果未能解决你的问题,请参考以下文章
在 Spark Scala 中的列上运行累积/迭代 Costum 方法
在 Apache Spark (Scala) 上获取两个数据帧的差异
在 Spark (Scala) 中将时间戳转换为字符串而不会丢失毫秒