我有一个如下所示的数据框,现在我需要将数据输出作为键值对转置。其中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)
在这方面的任何帮助都会很有帮助。
答案 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|
#+------+-----+