Spark数据框:如何在groupBy + sum之后使用

Posted

技术标签:

【中文标题】Spark数据框:如何在groupBy + sum之后使用【英文标题】:Spark dataframe : how to use as after a groupBy + sum 【发布时间】:2017-09-28 09:27:20 【问题描述】:

我的问题很简单,但我似乎找不到合适的解决方案。我可以用可怕的代码破解它,我想找到一些优雅的东西。

这是我的代码行:

    val summedDF = dataFrame.groupBy(colsNamesGroupBy.head, colsNamesGroupBy.tail : _*).sum(colsNamesSum:_*)

它对列名数组执行 groupBy,然后对几列求和。

一切正常,但我得到具有以下名称的列:sum(xxxx)。 我想在旅途中重命名这些,也许用地图操作,所以我只保留“xxxx”的名字。

有人知道吗?

编辑:

我正在尝试类似的方法,但我得到“无法使用此签名解析符号 agg”:

    val summedDF = dataFrame.groupBy(colsNamesGroupBy.head, colsNamesGroupBy.tail : _*).agg(colsNamesSum.map(c => sum(c).as(c)))

【问题讨论】:

你看过这个答案***.com/questions/33882894/… 【参考方案1】:

我会尝试这样的:

import org.apache.spark.sql.functions.sum, col

val aggregateExpr = colsNamesSum.map(c => sum(col(c)).as(c))

val summedDF = dataFrame.groupBy(colsNamesGroupBy.head, colsNamesGroupBy.tail : _*).agg(aggregateExpr.head, aggregateExpr.tail: _*)

【讨论】:

我真的很想完成这项工作,因为这是我正在寻找的解决方案 我得到 typeMismatch 异常 对不起,我最近迁移到 Spark 2.1.1,所以 .agg() 方法有一些变化,我不知道。我将编辑我的答案。 这适用于我的情况(Spark 2.1.1)。请尝试一下。 现在我必须找到如何只保留具有相同名称的第二列:p【参考方案2】:

你需要导入

import org.apache.spark.sql.functions._

所以你可以使用.agg

【讨论】:

以上是关于Spark数据框:如何在groupBy + sum之后使用的主要内容,如果未能解决你的问题,请参考以下文章

Spark Dataframe GroupBy 和计算复杂聚合函数

Spark Scala数据框具有单个Group By的多个聚合[重复]

如何在 python 中使用 Spark Data frame 和 GroupBy 派生 Percentile

将列的名称保留在 groupby 中,并在 pandas 数据框中使用 sum

使用 sum 函数从 groupby 数据框中排除日期列

如何使用group by聚合spark中的结构数组