根据更改的列的值减少火花数据帧



我想要一个减少数据帧大小的spark-scala代码。有一列";状态";并且存在另一列";时间"。当状态更改时,我只想要这些行。

当前数据帧

Time  Status
100    Running
200    Running
300    Stopped
400    Stopped
500    Running
600    Running 
700    Stopped 
800    Ended

现在我想要一个在状态更改时只有行的数据帧。因此,所需的数据帧将是

Time  Status
100    Running
300    Stopped
500    Running
700    Stopped 
800    Ended


val df = currentDf.withColumn("dummy_id",lit(1))
val windowSpec  = Window.partitionBy("dummyId").orderBy("stamp")
val df2 = df.withColumn("prev_status",lag("Status",1).over(windowSpec))
val finalDf = df2.filter($"prev_status".isNull  || $"Status" =!= $"prev_status")
.drop("prev_status")

虽然这将起作用,但这将把整个数据带到1个执行器,并且不可扩展。

如果你的数据不多,那么你可以这样做。

或者,使用RDD和mapPartitions可以提高并行性。ref这将是复杂的,但更具表演性。

最新更新