如何在 PySpark 中编写条件正则表达式替换?

Posted

技术标签:

【中文标题】如何在 PySpark 中编写条件正则表达式替换?【英文标题】:How can I write conditional regex replace in PySpark? 【发布时间】:2021-03-23 18:11:24 【问题描述】:

我试图让 if else 语句以 when()otherwise() 函数的形式工作。我尝试了很多方法,但我的问题是when() 语句需要一个列。有没有办法让以下代码以when()otherwise() 格式工作?

get_data = spark.sql("SELECT STRING() AS  FROM  WHERE Mobile=''".format(dynamic_tag_mapping_column_name, match[0], dynamic_tag_mapping_table_name, mobile_numbers[mob])).collect()[0][0]
if get_data!='0':
     textList.append(campaign_segment_text.withColumn('CampaignSMSText', func.expr("regexp_replace(CampaignSMSText, '', )".format(match[0], get_data)))
else:
     textList.append(campaign_segment_text.withColumn('CampaignSMSText', func.expr("regexp_replace(CampaignSMSText, '', )".format(match[0], dynamic_default_value)))

我想要实现的是,如果我从数据库中获取get_data>0 值,它将采用get_data 值,但如果get_data=0,它将分配一个已设置的默认值。我尝试将 String 值设置为从 DB 获取的 Int 值,但无法比较,因为 get_data 不是列。有没有办法让这个工作?

【问题讨论】:

【参考方案1】:

尝试将case when 放入F.expr

get_data = spark.sql("SELECT  AS  FROM  WHERE Mobile=''".format(dynamic_tag_mapping_column_name, match[0], dynamic_tag_mapping_table_name, mobile_numbers[mob])).collect()[0][0]

textList.append(
    campaign_segment_text.withColumn(
        'CampaignSMSText',
        func.expr(
            "regexp_replace(CampaignSMSText, '', case when  != 0 then  else  end)".format(
                match[0], get_data, get_data, dynamic_default_value
            )
        )
    )
)

【讨论】:

@VarunNagrare 我在您的代码(以及我的代码)中发现了一个缺少的右括号,您能再试一次吗? 好的,我去看看 是的,它成功了!谢啦。你的回答第二次帮助了我。 :D 我知道 UDF 很慢。我只是想练习,因为我不知道 UDF 是如何工作的。 是的,您可以使用 udf。 udf 将字符串、模式和要替换的模式作为输入参数,并返回替换后的字符串

以上是关于如何在 PySpark 中编写条件正则表达式替换?的主要内容,如果未能解决你的问题,请参考以下文章

如何替换/删除 PySpark RDD 中的正则表达式?

如何在 Pyspark 中基于正则表达式条件验证(和删除)列,而无需多次扫描和改组?

pyspark用正则表达式替换正则表达式

通过正则表达式在 Notepad++ 中替换时如何使用条件

PySpark 2 - 正则表达式替换 <BR> 之前的所有内容

如何编写正则表达式来查找/替换 HTML 类? [复制]