У меня есть фрейм данных pyspark df, такой как
+-----+----+------------+------------+-------------+------------+
| Name| Age| P_Attribute|S_Attributes|P_Values |S_values |
+-----+----+------------+------------+-------------+------------+
| Bob1| 16 | [x1,x2] | [x1,x3]|["ab",1] | [1,2] |
| Bob2| 16 |[x1,x2,x3] | [] |["a","b","c"]| [] |
+-----+----+------------+------------+-------------+------------+
Я хотел бы завершить создание df, как показано ниже,
+-----+----+------------+------------+
| Name| Age| Attribute | Values|
+-----+----+------------+------------+
| Bob1| 16 | x1 | ab |
| Bob1| 16 | x2 | 1 |
| Bob1| 16 | x1 | 1 |
| Bob1| 16 | x3 | 2 |
| Bob2| 16 | x1 | a |
| Bob2| 16 | x2 | b |
| Bob2| 16 | x3 | c |
+-----+----+------------+------------+
В основном я хочу объединить эти 2 столбца и разбить их на строк. С помощью функций массива pyspark мне удалось объединить массивы и взорвать их, но позже выявить разницу между профессиональными атрибутами и спортивными атрибутами, поскольку они могут иметь одинаковые имена. Мне также нужен столбец типа
+-----+----+------------+------------+------------+
| Name| Age| Attribute| type |Value |
+-----+----+------------+------------+------------+
| Bob1| 16 | x1 | 1 | ab |
| Bob1| 16 | x2 | 1 | 1 |
| Bob1| 16 | x1 | 2 | 1 |
| Bob1| 16 | x3 | 2 | 2 |
| Bob2| 16 | x1 | 1 | a |
| Bob2| 16 | x2 | 1 | b |
| Bob2| 16 | x3 | 1 | c |
+-----+----+------------+------------+------------+
Поэтому я подумал создать столбцы отдельного массива изначально как
+-----+----+------------+------------+------------+------------+
| Name| Age| P_Attribute|S_Attributes|P_type |S_type |
+-----+----+------------+------------+------------+------------+
| Bob1| 16 | [x1,x2] | [x1,x3]| [1,1] | [2,2] |
| Bob2| 16 |[x1,x2,x3] | [] | [1,1,1] | [] |
+-----+----+------------+------------+------------+------------+
, чтобы я мог объединять столбцы и разбивать столбцы требуемого типа а также как показано выше df. Проблема в том, что я не могу динамически создавать столбцы P_type и S_type. Я попробовал ниже код,
new_df = df.withColumn("temp_P_type", F.lit(1))\
.withColumn("P_type", F.array_repeat("temp_P_type",F.size("P_Attribute")))
Это выдает TypeError: Column is not iterable
ошибка. это также не работает, если длина столбца уже извлечена как другой столбец. Кто-нибудь может мне помочь с этим или есть ли лучшее решение для этого? Можно ли сделать это как уровень df без перехода к функциям RDD и python (без UDF)?
PS Я использую свечу 2,4