#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. Все столбцы должны иметь один и тот же тип данных. Приведите их к строке и примените стек