При работе со строками иногда приходится заменять одни строки столбца DataFrame на другие. Apache PySpark предлагает массу возможностей это сделать. В этой статье поговорим о том, как заменить строковые значения столбца с помощью регулярных выражений, как заменить определенные символы через функцию translate, а также как заменить значения одного столбца на значения другого через функцию overlay.
В качестве исходной таблице будет использовать DataFrame ниже. Также мы заранее импортировали функции PySpark SQL.
import pyspark.sql.functions as F
df = spark.createDataFrame([
('py', 'Anton'),
('c', 'Valentina'),
('py', 'Andry23'),
('cpp', 'Alex189'), ],
['lang', 'name']
)
Как заменить строковые значения в одном столбце в PySpark
Возможно вам понадобилось заменить или подправить некоторые строковые значения столбца. Тогда вы можете воспользоваться SQL-функцией regexp_replace, которая на основании регулярного выражения будет заменять соответствующие символы. Первым параметром функция regexp_replace принимает имя столбца, вторым — регулярное выражение, третьим — на что заменяем.
Код курса
GRAS
Ближайшая дата курса
по запросу
Продолжительность
ак.часов
Стоимость обучения
0 руб.
Допустим требуется заменить все имена начинающиеся с An на On. Тогда код на Python для замены строки на основе регулярного выражения выглядит так:
df.withColumn('name', F.regexp_replace('name', 'An', 'Or'))
"""
+----+---------+
|lang| name|
+----+---------+
| py| Orton|
| c|Valentina|
| py| Ordry23|
| cpp| Alex189|
+----+---------+
"""
Или, например, нужно убрать цифры из имён. В нашем DataFrame две таких записи с цифрами, от которых мы хотим избавиться. Это сделать можно через диапазоны [0-9], вот так:
# Либо просто один столбец вернуть:
# df.select(F.regexp_replace('name', 'An', 'Or').alias('name'))
df.withColumn('name', F.regexp_replace('name', '[0-9]', ''))
"""
+----+---------+------+------+---+
|lang| name| city|salary|age|
+----+---------+------+------+---+
| py| Anton|Moscow| 23| 19|
| c|Valentina| Omsk| 27| 25|
| py| Andry|Moscow| 24| 22|
| cpp| Alex| Omsk| 32| 25|
+----+---------+------+------+---+
"""
Регулярные выражения — это очень полезный инструмент, о котором можно говорить долго. У нас даже есть небольшая статья, где вы можете ознакомиться с ними.
Как заменить один символ за другой в PySpark
Если вам нужно заменить только некоторые символы, то используйте функцию translate, которая должна работать быстрее, чем regexp_replace. Первый параметр — имя столбца, второй — последовательность символом для замены, третий — символы, на которые заменяем.
Например, следующий код в PySpark:
df.select(F.translate('name', 'Aer', '$!').alias('name'))
— заменит символ A на $, e на ! и r на пустой символ (т.е. просто удалит его).
""" +---------+ | name| +---------+ | $nton| |Val!ntina| | $ndy23| | $l!x189| +---------+ """
Как заменить значения одного столбца на значения другого
В PySpark 3.0 появилась функция overlay, которая заменяет строку одного столбца на заданные символы строки другого столбца. Первым параметром src задает столбец, куда происходит замена, второй replace — откуда (из какого столбца), третий pos — от какого индекса заменяемой строки производить замену, четвертый len — сколько символов нужно заменить.
Четвертый параметр по умолчанию равен -1, что значит заменить столько символов, сколько имеется во втором столбце, т.е. все. Рассмотрим примеры.
Выставим pos = 0:
df.withColumn('res', F.overlay('name', 'lang', 0))
"""
+----+---------+----------+
|lang| name| res|
+----+---------+----------+
| py| Anton| pynton|
| c|Valentina|cValentina|
| py| Andry23| pyndry23|
| cpp| Alex189| cppex189|
+----+---------+----------+
"""
Как видим, первый символ, т.е. символ с индексом 0, был заменен на строку из lang.
А вот при значении pos превышающем количество символов в src результат будет просто добавлен в конец:
df.withColumn('res', F.overlay('name', 'lang', 100).alias('res'))
"""
+----+---------+----------+
|lang| name| res|
+----+---------+----------+
| py| Anton| Antonpy|
| c|Valentina|Valentinac|
| py| Andry23| Andry23py|
| cpp| Alex189|Alex189cpp|
+----+---------+----------+
"""
Значение len определяет сколько символов нужно заменить. Например, следующий код на Python:
df.withColumn('res', F.overlay('name', 'lang', 3, 5).alias('res'))
"""
+----+---------+-----+
|lang| name| res|
+----+---------+-----+
| py| Anton| Anpy|
| c|Valentina|Vacna|
| py| Andry23| Anpy|
| cpp| Alex189|Alcpp|
+----+---------+-----+
"""
Заменяет строку, начиная с 3-го символа, на 5 символов из столбца replace. Если в столбце replace нет столько символов, то в заменяемой строке будут удалены столько, сколько не хватает. Например, в строке Valentina 5 символов, начиная с 3-ей, следующие: lenti — эти символы будут заменены на c.
Отметим также, что все эти функции могут быть использованы с методами фильтрации, о котором говорили тут. А еще больше подробностей о способах обработки строк в PySpark вы узнаете на наших образовательных курсах в лицензированном учебном центре обучения и повышения квалификации руководителей и IT-специалистов (менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data) в Москве:
- Анализ данных с Apache Spark
- Машинное обучение в Apache Spark
- Графовые алгоритмы в Apache Spark
- Потоковая обработка в Apache Spark
- Основы Apache Spark для разработчиков



