如何在数据帧中获取延迟列值?

时间:2017-09-08 03:49:16

标签: scala apache-spark apache-spark-sql spark-dataframe

我有传感器数据,传感器的数据格式是(值,时间戳)。我将传感器值放入DataFrame,DataFrame的值为:

+-----+-------------+
|value|    timestamp|
+-----+-------------+
|    1|1493626740000|
|    7|1493626741000|
|    3|1493626743000|
|    5|1493626744000|
|    7|1493626746000|
|    9|1493626747000|
|    7|1493626748000|
|    9|1493626749000|
+-----+-------------+ 

时间戳是有序的,时间戳间隔是不同的,我想延迟一个数据点的值,这是我期望的结果:

enter image description here

我应该在数据帧上执行哪种操作才能完成此操作?

这是输入代码:

val arr = Array((1, 1493626740000L), (7, 1493626741000L), (3, 1493626743000L), (5, 1493626744000L), (7, 1493626746000L), (9, 1493626747000L), (7, 1493626748000L), (9, 1493626749000L))
    var df= sc.parallelize(arr, 4).toDF("value","timestamp")

1 个答案:

答案 0 :(得分:0)

您可以使用spark中可用的lag函数,偏移量为1.使用示例数据:

val w = org.apache.spark.sql.expressions.Window.orderBy("timestamp")
val defaultValue = df.head.getAs[Int]("value")

val df1 = df.withColumn("valueDelay", lag("value", 1, defaultValue).over(w))
df1.show()

+-----+-------------+----------+
|value|    timestamp|valueDelay|
+-----+-------------+----------+
|    1|1493626740000|         1|
|    7|1493626741000|         1|
|    3|1493626743000|         7|
|    5|1493626744000|         3|
|    7|1493626746000|         5|
|    9|1493626747000|         7|
|    7|1493626748000|         9|
|    9|1493626749000|         7|
+-----+-------------+----------+

如果您知道第一个值始终为1,则可以跳过查找第一行中的值并仅将lag的默认值设置为1(它仅用于第一行)在这种情况下)。

希望它有所帮助!