У меня есть фрейм данных, который возвращает вывод как
Я хотел бы перенести это в
Может кто-нибудь помочь понять, как подготовить код pyspark для динамического достижения этого результата. Я пробовал Unpivot в sql, но не повезло.
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|
+--------+-----+
по какой-то причине я получаю сообщение о том, что объект 'str' не вызывается. Мне пришлось повторно выполнить pyspark.sql.functions import *, чтобы это сработало. Какую ошибку я делаю. Я также пробовал из функций импорта pyspark.sql как F
Не могу понять, как может возникнуть ошибка. Вероятно, проблемы с вашими большими наборами данных. попробуйте заменить df.columns списком фактических столбцов, в которых вы хотите, чтобы это выполнялось
Как упоминалось в учебнике 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 |
+--------+-----+
Вау, спасибо большое. Это сработало. Приятно учиться на этом :-)