这是我要解决的问题的代表。我有一个数据框,我需要旋转它。为此,我需要在不同的列上应用不同的聚合函数。
此示例中,我将df设置为nos频率:
val unique_nos = Seq(1, 2, 3, 4)
val df = Seq(1, 2, 3, 1, 2, 2, 3, 2, 1, 3, 4).toDF("nos")
df.groupBy("nos").pivot("nos", unique_nos).agg(count(col("nos"))).show(10)
这将输出显示为
+---+----+----+----+----+
|nos| 1| 2| 3| 4|
+---+----+----+----+----+
| 1| 3|null|null|null|
| 3|null|null| 3|null|
| 4|null|null|null| 1|
| 2|null| 4|null|null|
+---+----+----+----+----+
这很酷,但是我需要将单独的agg函数应用于单独的列,所以这次我做这样的事情(为简单起见,我将相同的函数映射到所有cols。实际上,我将使用不同的agg进行seq分配的功能):
val unique_nos = Seq(1, 2, 3, 4)
val exprs1 = unique_nos.map(_.toString -> "count").toMap
val df = Seq(1, 2, 3, 1, 2, 2, 3, 2, 1, 3, 4).toDF("nos")
df.groupBy("nos").pivot("nos", unique_nos).agg(exprs1).show(10)
但这会引发错误-
org.apache.spark.sql.AnalysisException: Cannot resolve column name "1" among (nos);
关于我可能会缺少的任何线索吗?