Проверьте, соответствует ли столбец pyspark регулярному выражению, и создайте новый столбец на основе результатов. - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть фрейм данных pyspark, который выглядит следующим образом:

df:
+----+--------------------+
|  ID|               Email|
+----+--------------------+
|2345|  sample@example.org|
|2398| sample2@example.org|
|2328|   sampleexample.org|
|3983|   sample@exampleorg|
+----+--------------------+

Я хочу применить регулярное выражение к указанному выше фрейму данных (столбец электронной почты) и добавить новый столбец на основе результатов соответствия (True илиЛожь). Мое регулярное выражение выглядит так:

regex = '^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$' 

В основном проверяю, является ли это действительное письмо или нет. И желаемый результат:

df2:
+----+--------------------+--------+
|  ID|               Email| Matched|
+----+--------------------+--------+
|2345|  sample@example.org|    True|
|2398| sample2@example.org|    True|
|2328|   sampleexample.org|   False|
|3983|   sample@exampleorg|   False|
+----+--------------------+--------+

Я знаю только о кадре данных filter, который удалит те, которые не соответствуют шаблону и не являются желаемым результатом. Я также подумал об использовании этого регулярного выражения в качестве функции и применил его к столбцу электронной почты и сделал что-то вроде следующего:

def check(email):  
    if(re.search(regex, email)):  
        return True
    else:  
        return False
udf_check_email = udf(check, BooleanType())
df.withColumn('matched', udf_check_email(df.email)).show()

Но я не уверен, является ли это наиболее эффективным способом сделать это. Есть предложения?

1 Ответ

0 голосов
/ 07 ноября 2019

мы можем использовать SQL rlike функцию как,

df = df.withColumn('matched',F.when(df.email.rlike('^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$'),True).otherwise(False))
...