我想要一个减少数据帧大小的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这将是复杂的,但更具表演性。