我有一个带有多个数字列的数据框,这些数字列是不固定的(它们可以在每次执行期间更改)。假设我有一个带有数字列名称的Seq对象。 我想为每个这些列应用一个聚合函数。我尝试了以下方法:
println(numeric_cols)
// -> Seq[String] = List(avgTkts_P1, avgTkts_P2, avgTkts_P3, avgTkts_P4)
var sum_ops = for (c <- numeric_cols) yield org.apache.spark.sql.functions.sum(c).as(c)
var result = df.groupBy($"ID").agg( sum_ops:_* )
但这给了我以下错误:
scala> var avgTktsPerPeriodo = df.groupBy("ID").agg(sum_ops:_*)
<console>:79: error: overloaded method value agg with alternatives:
(expr: org.apache.spark.sql.Column,exprs: org.apache.spark.sql.Column*)org.apache.spark.sql.DataFrame <and>
(exprs: java.util.Map[String,String])org.apache.spark.sql.DataFrame <and>
(exprs: scala.collection.immutable.Map[String,String])org.apache.spark.sql.DataFrame <and>
(aggExpr: (String, String),aggExprs: (String, String)*)org.apache.spark.sql.DataFrame
cannot be applied to (org.apache.spark.sql.Column)
你知道这在火花标度中可行吗?
答案 0 :(得分:1)
如果您查看签名之一:
(expr: org.apache.spark.sql.Column,exprs: org.apache.spark.sql.Column*)org.apache.spark.sql.DataFrame
第一个参数是Column
表达式,第二个参数是varargs。
您需要执行以下操作:
val result = df.groupBy($"ID").agg( sum_ops.head, sum_ops.tail:_* )
答案 1 :(得分:0)
确定找到解决方法(Spark中的agg函数接受Map [colname-> operation]):
var agg_ops = numeric_cols map (c => c -> "sum") toMap
var result = df.groupBy($"ID").agg( agg_ops )