Вы можете использовать функции агрегирования как внутри окна (ваш первый случай), так и при группировании (ваш второй случай). Разница в том, что с окном каждая строка будет связана с результатом агрегации, вычисленной для всего окна. Однако при группировании каждая группа будет связана с результатом агрегирования в этой группе (группа строк становится только одной строкой).
В вашей ситуации вы бы получили это.
val dataframe = spark.range(6).withColumn("key", 'id % 2)
dataframe.show
+---+---+
| id|key|
+---+---+
| 0| 0|
| 1| 1|
| 2| 0|
| 3| 1|
| 4| 0|
| 5| 1|
+---+---+
Случай 1: оконное дело
val windowing = Window.partitionBy("key")
dataframe.withColumn("sum", sum(col("id")) over windowing).show
+---+---+---+
| id|key|sum|
+---+---+---+
| 0| 0| 6|
| 2| 0| 6|
| 4| 0| 6|
| 1| 1| 9|
| 3| 1| 9|
| 5| 1| 9|
+---+---+---+
Случай 2: группировка
dataframe.groupBy("key").agg(sum('id)).show
+---+-------+
|key|sum(id)|
+---+-------+
| 0| 6|
| 1| 9|
+---+-------+