У меня есть фрейм данных, как показано ниже, теперь мне нужно перенести вывод данных в виде пары ключ-значение. Где ключ является именем столбца, а значение - значением столбца.
+---+----+------+-----+
|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)
Любая помощь в этом аспекте будет очень полезной.
Возможный дубликат Транспонировать столбец в строку с помощью Spark
@pault тоже пробовал то же самое, но, похоже, это не сработало, ответ, предоставленный вами ниже, сработал как шарм. Благодаря тонну
@user10938362 user10938362 тоже попробовал этот фрагмент кода, но не получил ожидаемого результата, если вы можете объяснить мне, код, используемый в этой ссылке, был бы действительно полезен
Другим вариантом в этом случае будет создание 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|
#+------+-----+
Однострочный код творит чудеса :) Спасибо. Если вы не возражаете, не могли бы вы объяснить, что происходит в однострочном коде.
@Joby create_map
принимает четное количество аргументов, которые представляют собой чередующиеся ключи и значения. Понимание списка создает кортежи буквального значения столбца (lit(c)
) и значения столбца col(c)
для каждого столбца в вашем фрейме данных. chain.from_iterable
сглаживает эту вложенную структуру, а оператор *
используется для распаковки аргументов и передачи их в create_map
. Наконец, используйте explode
, чтобы превратить MapType
в ряды key
и value
.
Возможный дубликат Как расплавить Spark DataFrame?