我有一个数据帧,其中有几个数值列是不固定的(它们在每次执行过程中都会发生变化)。假设我有一个带有数字列名称的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)你知道这在spark-scala中是否可行吗?
发布于 2018-09-04 22:41:51
如果你看一下其中一个签名:
org.apache.spark.sql.Column*)org.apache.spark.sql.DataFrame (表达式:
,表达式: org.apache.spark.sql.Column
第一个参数是一个Column表达式,第二个参数是一个变量。
你需要做一些类似的事情:
val result = df.groupBy($"ID").agg( sum_ops.head, sum_ops.tail:_* )发布于 2018-09-04 22:42:11
Ok找到了一个解决方案( Spark中的agg函数接受Mapcolname的->操作):
var agg_ops = numeric_cols map (c => c -> "sum") toMap
var result = df.groupBy($"ID").agg( agg_ops )https://stackoverflow.com/questions/52168593
复制相似问题