首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spark-scala聚合列表中的多个列

Spark-scala聚合列表中的多个列
EN

Stack Overflow用户
提问于 2018-09-04 22:29:55
回答 2查看 2.5K关注 0票数 0

我有一个数据帧,其中有几个数值列是不固定的(它们在每次执行过程中都会发生变化)。假设我有一个带有数字列名称的Seq对象。我想对这些列中的每一列应用一个聚合函数。我尝试过以下几种方法:

代码语言:javascript
运行
复制
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:_* )

但它给出了以下错误:

代码语言:javascript
运行
复制
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中是否可行吗?

EN

回答 2

Stack Overflow用户

发布于 2018-09-04 22:41:51

如果你看一下其中一个签名:

org.apache.spark.sql.Column*)org.apache.spark.sql.DataFrame (表达式:

,表达式: org.apache.spark.sql.Column

第一个参数是一个Column表达式,第二个参数是一个变量。

你需要做一些类似的事情:

代码语言:javascript
运行
复制
val result = df.groupBy($"ID").agg( sum_ops.head, sum_ops.tail:_* )
票数 1
EN

Stack Overflow用户

发布于 2018-09-04 22:42:11

Ok找到了一个解决方案( Spark中的agg函数接受Mapcolname的->操作):

代码语言:javascript
运行
复制
var agg_ops =  numeric_cols map (c => c -> "sum") toMap

var result = df.groupBy($"ID").agg( agg_ops )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52168593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档