#regex #apache-spark #pyspark #apache-spark-sql #pattern-matching
Вопрос:
Я пытался получить некоторое представление о regexp_extract в pyspark и попытался проверить эту опцию, чтобы лучше понять.
Ниже приведен мой фрейм данных
data = [('2345', 'Checked|by John|for kamal'),
('2398', 'Checked|by John|for kamal '),
('2328', 'Verified|by Srinivas|for kamal than some random text'),
('3983', 'Verified|for Stacy|by John')]
df = sc.parallelize(data).toDF(['ID', 'Notes'])
df.show()
---- -----------------------------------------------------
| ID| Notes |
---- -----------------------------------------------------
|2345|Checked|by John|for kamal |
|2398|Checked|by John|for kamal |
|2328|Verified|by Srinivas|for kamal than some random text |
|3983|Verified|for Stacy|by John |
---- -----------------------------------------------------
Итак, здесь я пытался определить, проверяется или проверяется удостоверение личности Джоном
С помощью членов SO я смог взломать использование regexp_extract и пришел к следующему решению
result = df.withColumn('Employee', regexp_extract(col('Notes'), '(Checked|Verified)(\|by John)', 1))
result.show()
---- ------------------------------------------------ ------------
| ID| Notes |Employee|
---- ------------------------------------------------ ------------
|2345|Checked|by John|for kamal | Checked|
|2398|Checked|by John|for kamal | Checked|
|2328|Verified|by Srinivas|for kamal than some random text| |
|3983|Verified|for Stacy|by John | |
---- -------------------- ----------------------------------------
Для нескольких идентификаторов это дает мне идеальный результат ,но для последнего идентификатора он не был проверен. Не мог бы кто-нибудь, пожалуйста, сообщить мне, нужно ли выполнять какие-либо другие действия в упомянутом регулярном выражении?
Что я чувствую (Checked|Verified)(\|by John)
, так это соответствие только смежным значениям. Я попробовал * и $, но все равно он не напечатал Подтвержденный идентификатор 3983.
Ответ №1:
Я бы сформулировал регулярное выражение так:
(Checked|Verified)b.*bby John
ДЕМОНСТРАЦИЯ
За этим шаблоном Checked/Verified
следует by John
два, разделенных любым количеством текста. Обратите внимание, что я просто использую границы слов здесь вместо труб.
Обновленный код:
result = df.withColumn('Employee', regexp_extract(col('Notes'), 'b(Checked|Verified)b.*bby John', 1))
Комментарии:
1. Спасибо, Тим. Но сделал это, что дало вам результаты. Когда я заменил свое регулярное выражение на urs,я не получил никаких результатов.
Ответ №2:
Вы можете попробовать это регулярное выражение:
import pyspark.sql.functions as F
result = df.withColumn('Employee', F.regexp_extract('Notes', '(Checked|Verified)\|.*by John', 1))
result.show()
---- -------------------- --------
| ID| Notes|Employee|
---- -------------------- --------
|2345|Checked|by John|f...| Checked|
|2398|Checked|by John|f...| Checked|
|2328|Verified|by Srini...| |
|3983|Verified|for Stac...|Verified|
---- -------------------- --------
Ответ №3:
Другой способ-проверить, содержит ли столбец Примечания строку by John
:
df.withColumn('Employee',F.when(col('Notes').like('%Checked|by John%'), 'Checked').when(col('Notes').like('%by John'), 'Verified').otherwise(" ")).show(truncate=False)
---- ---------------------------------------------------- --------
|ID |Notes |Employee|
---- ---------------------------------------------------- --------
|2345|Checked|by John|for kamal |Checked |
|2398|Checked|by John|for kamal |Checked |
|2328|Verified|by Srinivas|for kamal than some random text| |
|3983|Verified|for Stacy|by John |Verified|
---- ---------------------------------------------------- --------
Комментарии:
1. Спасибо! Я ожидаю результата, подтвержденного для последнего идентификатора
2. Мне плохо. Для этого требовалось несколько выходов when. Смотрите мои правки