按 Scala Spark 中多列的总和分组

Group by then sum of multiple columns in Scala Spark

我有一个包含数百个特征列的 DataFrame,如下所示:

Country | ID   | Feature_1 | Feature_2 | Feature_3 |....
US        123       1            5          0
US        456       0            10         1
CA        789       0            6          1
CA        999       0            3          0
...

我想根据国家/地区执行分组,然后对每个特征求和,所以我应该得到这样的结果:

Country | Feature_1 | Feature_2 | Feature_3 | .... 
US             1          15         1 
CA             0           9         1 

如何有效地计算所有数百个特征的总和函数?我知道一个功能是这样的:

df.groupBy("Country").sum("Feature_1)

你可以试试

import org.apache.spark.sql.functions._
val df = Seq(
  ("a", 9, 1),
  ("a", 4, 2),
  ("b", 1, 3),
  ("a", 1, 4),
  ("b", 2, 5)
).toDF("name", "x", "y")

df.groupBy(col("name"))
  .agg(
    sum(col("x")).as("xsum"),
    sum(col("y")).as("ysum")
  )
  .show(false)

如果你想让它动态化:

var exprs:List[Column] = List()

for(col <- List[String]("x", "y")){
  exprs :+= expr(s"sum($col) as sum_$col")
}

df.groupBy(col("name"))
  .agg(
    exprs.head, exprs.tail:_*
  )
  .show(false)