Попробуйте с помощью .map
получить всю сумму агрегации для всех столбцов, а затем преобразовать как toMap
Example:
val df =Seq((1,2,3), (3,4,5),(1,1,1), (3,2,2))
.toDF("A", "B", "C")
val sum_expr=Seq("B","C").map((_ -> "sum")).toMap
df.groupBy('A).agg(sum_expr).show(false)
* +1012 *
Result:
+---+------+------+
| A|sum(B)|sum(C)|
+---+------+------+
| 1| 3| 4|
| 3| 6| 7|
+---+------+------+
Обновление:
val sum_alias=Seq("B", "C").map(c=>sum(c).as(s"sum_$c")) //returns List with alias for column
Поскольку .agg()
принимает строку, карту, столбец, .head
возвращает string
и tail
возвращает список и конвертирует в string
use : _*
.
Было бы легче понять, если бы мы использовали eclipse maven project
(intellisense), чтобы получить все функции и параметры, принимаемые функциями.
df_ppp.groupBy('A).agg(sum_alias.head,sum_alias.tail: _*).show(false)
Result:
+---+-----+-----+
|A |sum_B|sum_C|
+---+-----+-----+
|1 |3 |4 |
|3 |6 |7 |
+---+-----+-----+