首页 > 解决方案 > Spark 数据透视表不适用于表达式映射

问题描述

这是我要解决的问题的代表。我有一个数据框,我需要旋转它。有了这个,我需要在不同的列上应用不同的聚合函数。

这个例子我在 nos 的频率上旋转一个 df:

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);

关于我可能会丢失什么的任何线索?

标签: sqlapache-sparkapache-spark-sql

解决方案


推荐阅读