【问题标题】:Sum the column of a data frame in Spark 2.2.0 and Scala在 Spark 2.2.0 和 Scala 中对数据框的列求和
【发布时间】:2017-08-24 19:44:07
【问题描述】:

我正在尝试在 Spark/Scala 中对以下数据框中的列求和,该数据框本身是通过另一个数据框创建的。我使用这个答案作为指导:How to sum the values of one column of a dataframe in spark/scala

这是我的数据,由另一个聚合函数创建并分配给数据框:

+-------------+----+----+
|activityLabel| 1_3|4_12|
+-------------+----+----+
|           12|1075|   0|
|            1|   0|3072|
|            6|3072|   0|
|            3|   0|3072|
|            5|3072|   0|
|            9|3072|   0|
|            4|3072|   0|
|            8|3379|   0|
|            7|3072|   0|
|           10|3072|   0|
|           11|3072|   0|
|            2|   0|3072|
+-------------+----+----+

这是我创建数据框的代码:

def createRangeActivityLabels(df: DataFrame): Unit = {

  val activityRange: List[(Int, Int)] = List((1, 3), (4, 12))

  val exprs: List[Column] = activityRange.map {
    case (x, y) => {
      val newLabel = s"${x}_${y}"
      sum(when($"activityLabel".between(x, y), 0).otherwise(1)).alias(newLabel)
    }
  }

  val df3: DataFrame = df.groupBy($"activityLabel").agg(exprs.head, exprs.tail: _*)
  df3.show

这是得到总和的代码。我要做的就是将标记为 1_3 (exprs.head) 和 4_12 (exprs(1)) 的列相加

  val indexedLabel0: Int = df3.agg(sum(exprs.head)).first.getAs[Int](0)
}

我收到以下错误:org.apache.spark.sql.AnalysisException:不允许在另一个聚合函数的参数中使用聚合函数。请在子查询中使用内部聚合函数。;;

我尝试了多种解决方案来解决此问题,但似乎没有任何效果。所有想法都表示赞赏。谢谢!

【问题讨论】:

    标签: scala apache-spark apache-spark-sql spark-dataframe


    【解决方案1】:

    问题是 exprs.head 评估为 sum(when($"activityLabel".between(x, y), 0).otherwise(1)).alias(newLabel)。当你尝试 sum(exprs.head) 时,它会计算 sum 的总和。

    我认为你只需要列名。

    val columnsName: List[Column] = activityRange.map {
        case (x, y) => $"${x}_${y}"
    }
    val indexedLabel0 = df3.agg(sum(columnsName.head)).first.getAs[Long](0)
    

    @user8371915 感谢纠正我关于返回类型的问题

    【讨论】:

      猜你喜欢
      • 2016-08-30
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      相关资源
      最近更新 更多