scala - Spark scala中运行时间戳差异

标签 scala apache-spark apache-spark-sql

输入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 函数中遇到错误,有没有办法实现这个。如有任何建议,请。

最佳答案

假设您的 time 列的类型为 Timestamp,您可以使用 计算当前行和上一行之间的 time 差异unix_timestamp 以及 lag窗口函数。

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|
// +-------+------+-------------------+----+

关于scala - Spark scala中运行时间戳差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50919106/

相关文章:

scala - 在多模块项目中从 sbt 运行单个测试类

http - 如何在 Java 中安全地处理原始(文件)数据?

apache-spark - 为什么我的count,Distinct和Distinct count在spark的巨大集群中非常慢

python - 使用 'struct_name.*' 选择时为所有列提供前缀

scala - 从函数返回通用父类(super class)而不是子类

apache-spark - 如何使用 Spark 对象获取 Hive 表的位置值?

python - pyspark,比较数据框中的两行

python - 没有列参数的 df.repartition 对什么进行分区?

python - pyspark:使用模式加入?或者将模式转换为列表?

json - 如何在Play Framework中将Scala Map序列化为Json?