将数据框的行和列转置为键值对

时间:2019-05-21 14:54:02

标签: apache-spark pyspark

我有一个如下所示的数据框,现在我需要将数据输出作为键值对转置。其中Key为ColumnName,而Value为columnValue。

+---+----+------+-----+
|age| dob|gender| name|
+---+----+------+-----+
| 25|1991|     M|Ankit|
+---+----+------+-----+

必需的输出

+-------+-------+
|Key    |Value  |
+-------+-------+
|age    |25     |
|dob    |1991   |
|gender |M      |
|name   |Ankit  |
+-------+-------+

我尝试使用以下链接https://codereview.stackexchange.com/questions/200391/pyspark-code-that-turns-columns-into-rows

中给出的示例代码

但这给我一个如下错误,

cPickle.PicklingError: Could not serialize object: Py4JError: An error occurred while calling o149.__getnewargs__. Trace:
py4j.Py4JException: Method __getnewargs__([]) does not exist
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:318)
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:326)
    at py4j.Gateway.invoke(Gateway.java:274)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:238)
    at java.lang.Thread.run(Thread.java:748)

在这方面的任何帮助都会很有帮助。

1 个答案:

答案 0 :(得分:1)

在这种情况下,另一种选择是创建一个MapType的列和一个explode

from itertools import chain
from pyspark.sql.functions import col, create_map, explode, lit

df.select(
    explode(create_map(*chain.from_iterable([(lit(c), col(c)) for c in df.columns])))
).show()
#+------+-----+
#|   key|value|
#+------+-----+
#|   age|   25|
#|   dob| 1991|
#|gender|    M|
#|  name|Ankit|
#+------+-----+