Проблема с разделением столбца на большее количество столбцов в Pyspark

#apache-spark #pyspark #split #rdd #pyspark-dataframes

#apache-spark #разделение #rdd #pyspark

Вопрос:

У меня возникли проблемы с разделением столбца dataframe на несколько столбцов в PySpark:

У меня есть список списков, и я хочу преобразовать его в dataframe, каждое значение в одном столбце.

Что я пробовал:

Я создал фрейм данных из этого списка:

 [['COL-4560', 'COL-9655', 'NWG-0610', 'D81-3754'],
 ['DLL-7760', 'NAT-9885', 'PED-0550', 'MAR-0004', 'LLL-5554']]
  

Использование этого кода:

 from pyspark.sql import Row
R = Row('col1', 'col2')

# use enumerate to add the ID column
df_from_list = spark.createDataFrame([R(i, x) for i, x in enumerate(recs_list)])
  

Результат, который я получил, это:

  ---- -------------------- 
|col1|                col2|
 ---- -------------------- 
|   0|[COL-4560, COL-96...|
|   1|[DLL-7760, NAT-98...|
 ---- -------------------- 
  

Я хочу разделить значения запятой на столбцы, поэтому я попытался:

 from pyspark.sql import functions as F

df2 = df_from_list.select('col1', F.split('col2', ', ').alias('col2'))

# If you don't know the number of columns:
df_sizes = df2.select(F.size('col2').alias('col2'))
df_max = df_sizes.agg(F.max('col2'))
nb_columns = df_max.collect()[0][0]

df_result = df2.select('col1', *[df2['col2'][i] for i in range(nb_columns)])
df_result.show()
  

Но я получаю ошибку в этой строке df2 = df_from_list.select('col1', F.split('col2', ', ').alias('col2')) :

 AnalysisException: cannot resolve 'split(`col2`, ', ', -1)' due to data type mismatch: argument 1 requires string type, however, '`col2`' is of array<string> type.;;
  

Мой идеальный конечный результат был бы таким:

  ---------- ---------- ---------- ---------- ---------- 
|  SKU     |  REC_01  | REC_02   | REC_03   | REC_04   |
 ---------- ---------- ---------- ---------- ---------- 
| COL-4560 | COL-9655 | NWG-0610 | D81-3754 | null     |
| DLL-7760 | NAT-9885 | PED-0550 | MAR-0004 | LLL-5554 |
 --------------------- ---------- ---------- ---------- 
  

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

Кто-нибудь имеет представление о том, что происходит? Заранее большое вам спасибо.

Ответ №1:

df_from_list col2 Столбец Dataframe уже имеет array тип, поэтому нет необходимости разделять (поскольку разделение работает с stringtype, здесь у нас есть arraytype).

Вот шаги, которые будут работать для вас.

 recs_list=[['COL-4560', 'COL-9655', 'NWG-0610', 'D81-3754'],
 ['DLL-7760', 'NAT-9885', 'PED-0550', 'MAR-0004', 'LLL-5554']]

from pyspark.sql import Row
R = Row('col1', 'col2')

# use enumerate to add the ID column
df_from_list = spark.createDataFrame([R(i, x) for i, x in enumerate(recs_list)])

from pyspark.sql import functions as F

df2 = df_from_list

# If you don't know the number of columns:
df_sizes = df2.select(F.size('col2').alias('col2'))
df_max = df_sizes.agg(F.max('col2'))
nb_columns = df_max.collect()[0][0]

cols=['SKU','REC_01','REC_02','REC_03','REC_04']
df_result = df2.select(*[df2['col2'][i] for i in range(nb_columns)]).toDF(*cols)
df_result.show()
# -------- -------- -------- -------- -------- 
#|     SKU|  REC_01|  REC_02|  REC_03|  REC_04|
# -------- -------- -------- -------- -------- 
#|COL-4560|COL-9655|NWG-0610|D81-3754|    null|
#|DLL-7760|NAT-9885|PED-0550|MAR-0004|LLL-5554|
# -------- -------- -------- -------- --------