我有传感器数据,传感器的数据格式是(值,时间戳)。我将传感器值放入DataFrame,DataFrame的值为:
+-----+-------------+
|value| timestamp|
+-----+-------------+
| 1|1493626740000|
| 7|1493626741000|
| 3|1493626743000|
| 5|1493626744000|
| 7|1493626746000|
| 9|1493626747000|
| 7|1493626748000|
| 9|1493626749000|
+-----+-------------+
时间戳是有序的,时间戳间隔是不同的,我想延迟一个数据点的值,这是我期望的结果:
我应该在数据帧上执行哪种操作才能完成此操作?
这是输入代码:
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")
答案 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(它仅用于第一行)在这种情况下)。
希望它有所帮助!