При работе со строками иногда приходится заменять одни строки столбца 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 для разработчиков