#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|
# -------- -------- -------- -------- --------