+-------------+----+----+
|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:不允许在另一个聚合函数的参数中使用聚合函数。请在子查询中使用内部聚合函数。;;
我尝试了多种解决方案来解决这个问题,但似乎没有任何效果。所有的想法都得到了赞赏。谢了!
问题是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: 我的做法