шаблон регулярных выражений не работает в pyspark после применения логики - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть данные, как показано ниже:

>>> df1.show()
+-----------------+--------------------+
|     corruptNames|       standardNames|
+-----------------+--------------------+
|Sid is (Good boy)|     Sid is Good Boy|
|    New York Life| New York Life In...|
+-----------------+--------------------+

Итак, согласно приведенным выше данным мне нужно применить регулярное выражение, создать новый столбец и получить данные, как во втором столбце, т.е. standardNames. Я попробовал ниже код:

spark.sql("select *, case when corruptNames rlike '[^a-zA-Z ()]+(?![^(]*))' or corruptNames rlike 'standardNames' then standardNames else 0 end as standard from temp1").show()  

Выдает ниже ошибки:

pyspark.sql.utils.AnalysisException: "cannot resolve '`standardNames`' given input columns: [temp1.corruptNames, temp1. standardNames];

1 Ответ

1 голос
/ 05 ноября 2019

Попробуйте этот пример без select sql. Я предполагаю, что вы хотите создать новый столбец с именем standardNames на основе dirtyNames , если шаблон регулярного выражения равен true, в противном случае "сделать что-то еще ...".

Примечание: ваш шаблон не будет компилироваться, потому что вам нужно экранировать второй последний) с \.

pattern = '[^a-zA-Z ()]+(?![^(]*))' #this won't compile
pattern = r'[^a-zA-Z ()]+(?![^(]*\))' #this will

Code

import pyspark.sql.functions as F

df_text = spark.createDataFrame([('Sid is (Good boy)',),('New York Life',)], ('corruptNames',))

pattern = r'[^a-zA-Z ()]+(?![^(]*\))'

df = (df_text.withColumn('standardNames', F.when(F.col('corruptNames').rlike(pattern), F.col('corruptNames'))
             .otherwise('Do something else'))
             .show()
     )

df.show()

#+-----------------+---------------------+
#|     corruptNames|        standardNames|
#+-----------------+---------------------+
#|Sid is (Good boy)|    Do something else|
#|    New York Life|    Do something else|
#+-----------------+---------------------+

...