Как разделить строку на несколько столбцов с помощью Apache Spark / python в базах данных

#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. Принято! Еще раз спасибо, Ваебхав 🙂