Создайте новый фрейм данных в pyspark с именами столбцов и связанными с ним значениями в другом столбце с помощью spark/pyspark

#apache-spark #pyspark #apache-spark-sql

Вопрос:

у меня есть набор данных, как показано ниже

введите описание изображения здесь

и я хотел бы создать фрейм данных, используя приведенный выше набор данных, как показано ниже

введите описание изображения здесь

Ответ №1:

Сначала вам нужно сложить свой фрейм данных, сгруппировать по var_name и применить collect_list

 import pyspark.sql.functions as f


expr_columns = ', '.join(map(lambda col: '"{col}", {col}'.format(col=col), df.columns))
expr = "stack(2, {columns}) as (var_name, values)".format(columns=expr_columns)

df_stack = df.selectExpr(expr)
df_final = df_stack.groupBy("var_name").agg(f.collect_list(f.col("values")))
 

Комментарии:

1. Привет, Кафельс, я ценю ваши усилия, как я могу сделать значения стека динамическими, а не статическими ? решение должно работать для любого набора данных.

2. Привет, Кафельс, попробовал приведенный выше код на другом наборе данных, но он выдает ошибку в df_stack pyspark.sql.utils. AnalysisException: не удается разрешить ‘стек(2, ‘возраст’, age , ‘работа’, job , ‘семейное’, marital , ‘образование’, education , ‘по умолчанию’ default , ‘баланс’, balance , ‘жилище’, housing , ‘кредит’, loan , ‘контакт’, contact , «день» day , «месяц», month , ‘длительность’, duration , ‘кампания’, campaign , ‘pdays’, pdays , ‘предыдущий’, previous , ‘poutcome’, poutcome , ‘г’, y )’ из-за несоответствие типов данных: Аргумент 2 (тип bigint) != Довод 19 (строка); строка 1 поз 0;

3. Все столбцы должны иметь один и тот же тип данных. Приведите их к строке и примените стек