Spark数据透视表不适用于表达式映射

时间:2019-03-28 21:42:17

标签: sql apache-spark apache-spark-sql

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

此示例中,我将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);

关于我可能会缺少的任何线索吗?

0 个答案:

没有答案