#python #apache-spark #pyspark #split
Вопрос:
Попытка разделить строковый столбец на 4 столбца: A, B, C, D в базах данных с использованием python.
# Load CSV file
df = spark.read.format("csv").options(header='false').load("file path")
# Rename header
RawDataDF = RawDataDF.withColumnRenamed("_c0","raw")
#Attempt to split "raw" into 4 columns:
splitDF = RawDataDF.withColumn("split_raw_arr", split("raw", " "))
uDataDF= uDataDF.withColumn('Column A', splitDF.getItem(0))
uDataDF= uDataDF.withColumn('Column B', splitDF.getItem(1))
uDataDF= uDataDF.withColumn('Column C', splitDF.getItem(2))
uDataDF= uDataDF.withColumn('Column D', splitDF.getItem(3))
Сообщение об ошибке:
AttributeError: 'DataFrame' object has no attribute 'getItem'
Мы будем признательны за любой совет.
Комментарии:
1. как насчет
splitDF[0]
этого ?
Ответ №1:
Использование разделения для создания отдельных столбцов является правильным.
Однако вы не можете напрямую использовать getItem
фрейм данных ( splitDF
) , Ошибка, которую вы получаете, означает это.
Кроме того , вы, возможно, пропустили шаг инициализации uDataDF
в вопросе, и вы создаете значение столбца на основе spiltDF
, что также невозможно без объединения.
withColumn
не позволю этого, так как в качестве второго аргумента используется тип столбца.
Вы можете напрямую использовать splitDF
для создания столбцов, а затем выбрать те, которые необходимо сохранить, чтобы создать новый фрейм данных — uDataDF
Типичный пример — Разделение
input_list = [
(1,"7 6 10")
,(2,"4 59 9")
,(4,"5 00 12")
,(5,"0 10 241")
,(6,"7 19 62")
,(7,"1 42 743")
,(8,"6 23 90")
]
sparkDF = sql.createDataFrame(input_list,['id','raw_str'])
sparkDF = sparkDF.withColumn('A',F.split(F.col('raw_str'),' ').getItem(0).cast(DoubleType()))
.withColumn('B',F.split(F.col('raw_str'),' ').getItem(1).cast(DoubleType()))
.withColumn('C',F.split(F.col('raw_str'),' ').getItem(2).cast(DoubleType()))
uDataDF = sparkDF.select(['A','B','C'])
uDataDF.show()
--- ---- -----
| A| B| C|
--- ---- -----
|7.0| 6.0| 10.0|
|4.0|59.0| 9.0|
|5.0| 0.0| 12.0|
|0.0|10.0|241.0|
|7.0|19.0| 62.0|
|1.0|42.0|743.0|
|6.0|23.0| 90.0|
--- ---- -----
Комментарии:
1. Спасибо, это очень полезно, но все еще трудно разделить строку по желанию. У вас есть какие-либо советы о том, как я могу разделить строку на 4 столбца с помощью пробелов? В приведенном выше примере вы разделили строку»». Ps. разделение на » » или «» не сработало. Предполагая, что должно быть какое-то другое соглашение для пространств?
2. Обновлен ответ , пробел работает так же хорошо, как разделитель
3. Заговорил слишком рано! Это работало с использованием «t». Еще раз спасибо за вашу помощь
4. Принято! Еще раз спасибо, Ваебхав 🙂