Вы можете рассчитать совокупную сумму для выражения "case num = 0 then 1 else 0":
case class GrpRow(id: Int, num: Int)
val df = spark.sparkContext.parallelize(Seq(
GrpRow(0, 0),
GrpRow(1, 1),
GrpRow(2, 1),
GrpRow(3, 0),
GrpRow(4, 1),
GrpRow(5, 1),
GrpRow(6, 1),
GrpRow(7, 0),
GrpRow(8, 1)
)).toDF()
df
.withColumn(
"group_id",
sum(when(col("num") === 0, 1).otherwise(0))
.over(Window.rangeBetween(Window.unboundedPreceding, Window.currentRow).orderBy("id"))
.minus(1) // del this row if you want group_id starts with 1 instead of 0
)
.show()