Как преобразовать фрейм данных с 1 строкой и 4 столбцами в фрейм данных с 4 строками и 2 столбцами в pyspark или sql

У меня есть фрейм данных, который возвращает вывод как

Я хотел бы перенести это в

Может кто-нибудь помочь понять, как подготовить код pyspark для динамического достижения этого результата. Я пробовал Unpivot в sql, но не повезло.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
df =spark.createDataFrame([
(78,20,19,90),
],
('Machines',  'Books',  'Vehicles', 'Plants'))

Создайте новый массив столбцов структуры, который объединяет имена столбцов и имена значений. Используйте волшебную строку, чтобы взорвать поле структуры. Код ниже

df.withColumn('tab', F.array(*[F.struct(lit(x).alias('Fields'), col(x).alias('Count')).alias(x) for x in df.columns])).selectExpr('inline(tab)').show()


+--------+-----+
|  Fields|Count|
+--------+-----+
|Machines|   78|
|   Books|   20|
|Vehicles|   19|
|  Plants|   90|
+--------+-----+

Вау, спасибо большое. Это сработало. Приятно учиться на этом :-)

Ramaraju.d 23.11.2022 09:52

по какой-то причине я получаю сообщение о том, что объект 'str' не вызывается. Мне пришлось повторно выполнить pyspark.sql.functions import *, чтобы это сработало. Какую ошибку я делаю. Я также пробовал из функций импорта pyspark.sql как F

Ramaraju.d 23.11.2022 14:46

Не могу понять, как может возникнуть ошибка. Вероятно, проблемы с вашими большими наборами данных. попробуйте заменить df.columns списком фактических столбцов, в которых вы хотите, чтобы это выполнялось

wwnde 23.11.2022 23:17

Как упоминалось в учебнике unpivot-dataframe, используйте:

df = df.selectExpr("""stack(4, "Machines", Machines, "Books", Books, "Vehicles", Vehicles, "Plants", Plants) as (Fields, Count)""")

Или обобщить:

cols = [f'"{c}", {c}' for c in df.columns]
exprs = f"stack({len(cols)}, {', '.join(str(c) for c in cols)}) as (Fields, Count)"
df = df.selectExpr(exprs)

Полный пример:

df = spark.createDataFrame(data=[[78,20,19,90]], schema=['Machines','Books','Vehicles','Plants'])

# Hard coded
# df = df.selectExpr("""stack(4, "Machines", Machines, "Books", Books, "Vehicles", Vehicles, "Plants", Plants) as (Fields, Count)""")

# Generalised
cols = [f'"{c}", {c}' for c in df.columns]
exprs = f"stack({len(cols)}, {', '.join(str(c) for c in cols)}) as (Fields, Count)"
df = df.selectExpr(exprs)

[Out]:
+--------+-----+
|Fields  |Count|
+--------+-----+
|Machines|78   |
|Books   |20   |
|Vehicles|19   |
|Plants  |90   |
+--------+-----+

Другие вопросы по теме