应用逻辑后,正则表达式模式在 pyspark 中不起作用
Posted
技术标签:
【中文标题】应用逻辑后,正则表达式模式在 pyspark 中不起作用【英文标题】:regex pattern not working in pyspark after applying the logic 【发布时间】:2019-11-04 13:31:52 【问题描述】:我的数据如下:
>>> 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];
【问题讨论】:
有人看这个吗? 列名temp1. standardNames
有一个额外的前导空格。
【参考方案1】:
试试这个不带select sql
的例子。如果正则表达式模式为真,我假设您想基于 corruptNames 创建一个名为 standardNames 的新列,否则“做其他事情......”。
注意:您的模式将无法编译,因为您需要使用 \.
转义倒数第二个 )pattern = '[^a-zA-Z ()]+(?![^(]*))' #this won't compile
pattern = r'[^a-zA-Z ()]+(?![^(]*\))' #this will
代码
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|
#+-----------------+---------------------+
【讨论】:
以上是关于应用逻辑后,正则表达式模式在 pyspark 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
在 Pyspark 中按顺序应用多个正则表达式进行文本清理的最快方法