当前位置: 首页 > 知识库问答 >
问题:

在Spark 2.2.0和Scala中求和数据帧的列

唐康安
2023-03-14
+-------------+----+----+
|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
  val indexedLabel0: Int = df3.agg(sum(exprs.head)).first.getAs[Int](0)
}

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

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

共有1个答案

华子航
2023-03-14

问题是exprs.head的计算值为sum(when($“activitylabel”.between(x,y),0).否则(1)).alias(newLabel)。当你尝试求和(exprs.head)时,它将计算和的总和。

我想你只需要列名。

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

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

 类似资料:
  • 我想使用Spark和Scala强制转换dataframe的模式以更改某些列的类型。 具体地说,我正在尝试使用AS[U]函数,其描述为:“返回一个新的数据集,其中每个记录都映射到指定的类型。用于映射列的方法取决于U的类型。” 原则上,这正是我想要的,但我不能使它起作用。 下面是一个取自https://github.com/apache/spark/blob/master/sql/core/src/t

  • 我正在尝试连接两个apache spark sql DataFrame,并将第一个数据帧的列值替换为另一个。如: 我需要执行左连接并将 DF1.col1 的值替换为 DF2.col3,其中 DF1.col1 = DF2.col1。我不知道该怎么做。此外,如上例所示,DF1 除了“col1”和“col2”之外还有更多列,我无法对所有列都应用 select。我正在尝试类似的东西, 但这似乎行不通。另外

  • 这个问题和这个问题类似:R:两个/多个具有相同变量(列名)的数据帧的Sum列式值,并且以Date列作为引用,但是我的DF有不同的列数、列名,并且没有一个特定的引用列。 我试过合并、加入、通过...等

  • 我有一个pandas dataframe,我想在其中求和某些不规则间隔的日期之间的值。举个例子,我有这样的东西: 并且我知道这些总和的截止日期是2021-03-01、2021-03-04、2021-03-05,所以我想要截止日期和直到(但不包括)下一个截止日期产生的所有小部件的总和。所有不是截止日期的日期的值都为0。 这将产生如下所示的新列。 我怎么能在熊猫内部做到这一点呢?

  • 我有一个列为col1、col2、col3的数据帧。col3是下面定义的映射[String,String] 我按col1、col2进行分组,并使用collect_list进行聚合,以获得映射数组并存储在col4中。 然而,我希望将col4作为一个单独的映射,并将所有映射合并。目前我有: 预期输出 使用udf是否理想? 感谢您的帮助。谢谢

  • 情况: 两个数据帧(df1和df2)具有相同的三个索引,例如“A”、“B”、“C”。df1和df2的列数不同。df1和df2中的所有单元格都填充了float类型的数据。 DF1: DF2: 目标: 从df2中选择的列(例如“BBB”)与df1的每列相加后,结果应存储在新的数据帧(df_new)中。df_new的格式应为df1(列数和行数),并具有与df1相同的列名和索引。 new_df: 我的做法