Вот как вы можете сделать это в pyspark:
Укажите разделитель и кавычку на чтение
Если вы читаете данные из файла,Вы можете использовать spark.read_csv
со следующими аргументами:
df = spark.read.csv("path/to/file", sep=":", quote="#", header=True)
df.show()
#+-----+-------+-----+
#| Name|Roll_no|Class|
#+-----+-------+-----+
#|ab:cd| 23| C|
#|sd:ps| 34| A|
#|ra:kh| 14| H|
#|ku:pa| 36| S|
#|ra:sh| 50| P|
#+-----+-------+-----+
Использовать регулярные выражения
Если вы не можете изменить способ чтения данных, и выНачиная с DataFrame, показанного в вопросе, вы можете использовать регулярные выражения для получения желаемого результата.
Сначала получите новые имена столбцов, разделив существующее имя столбца на ":"
new_columns = df.columns[0].split(":")
print(new_columns)
#['Name', 'Roll_no', 'Class']
Для столбца Name
необходимо извлечь данные между #
с.Для двух других столбцов необходимо удалить строки между #
s (и следующими ":"
) и использовать pyspark.sql.functions.split
для извлечения компонентов
from pyspark.sql.functions import regexp_extract, regexp_replace, split
df.withColumn(new_columns[0], regexp_extract(df.columns[0], r"(?<=#).+(?=#)", 0))\
.withColumn(new_columns[1], split(regexp_replace(df.columns[0], "#.+#:", ""), ":")[0])\
.withColumn(new_columns[2], split(regexp_replace(df.columns[0], "#.+#:", ""), ":")[1])\
.select(*new_columns)\
.show()
#+-----+-------+-----+
#| Name|Roll_no|Class|
#+-----+-------+-----+
#|ab:cd| 23| C|
#|sd:ps| 34| A|
#|ra:kh| 14| H|
#|ku:pa| 36| S|
#|ra:sh| 50| P|
#+-----+-------+-----+