Как выполнить regexp_extract, если соответствующий шаблон находится в любом месте строки — pyspark

#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. Смотрите мои правки