Spark DF 数据透视错误:方法数据透视([class java.lang.String, class java.lang.String]) 不存在

NIT*_*ITS 3 python apache-spark apache-spark-sql pyspark

我是使用 Spark 数据帧的新手。我尝试pivot在 Spark(Spark 版本 2.x)中使用该方法并遇到以下错误:

Py4JError:调用 o387.pivot 时发生错误。跟踪: py4j.Py4JException:方法数据透视([类 java.lang.String,类 java.lang.String]) 不存在

尽管我有这里的agg功能first,但我确实不需要应用任何聚合。

我的数据框如下所示:

+-----+-----+----------+-----+
| name|value|      date| time|
+-----+-----+----------+-----+
|name1|100.0|2017-12-01|00:00|
|name1|255.5|2017-12-01|00:15|
|name1|333.3|2017-12-01|00:30|

Run Code Online (Sandbox Code Playgroud)

预期的:

+-----+----------+-----+-----+-----+
| name|      date|00:00|00:15|00:30|
+-----+----------+-----+-----+-----+
|name1|2017-12-01|100.0|255.5|333.3|

Run Code Online (Sandbox Code Playgroud)

我正在尝试的方式:

df = df.groupBy(["name","date"]).pivot(pivot_col="time",values="value").agg(first("value")).show
Run Code Online (Sandbox Code Playgroud)

我在这里犯了什么错误?

Sha*_*ica 5

问题出在函数的values="value"参数上pivot。这应该用于要旋转的实际值列表,而不是列名称。从文档中:

\n\n
\n

值 \xe2\x80\x93 将转换为输出 DataFrame 中的列的值列表。

\n
\n\n

和一个例子:

\n\n
\n
df4.groupBy("year").pivot("course", ["dotNET", "Java"]).sum("earnings").collect()\n[Row(year=2012, dotNET=15000, Java=20000), Row(year=2013, dotNET=48000, Java=30000)]\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

对于问题中的示例values应设置为["00:00","00:15", "00:30"]. 然而,values参数通常是不必要的(但会使枢轴更有效),因此您可以简单地更改为:

\n\n
df = df.groupBy(["name","date"]).pivot("time").agg(first("value"))\n
Run Code Online (Sandbox Code Playgroud)\n