首页 > 解决方案 > 如何在 PySpark 中编写条件正则表达式替换?

问题描述

我试图让 if else 语句以when()andotherwise()函数的形式工作。我尝试了很多方法,但我的问题是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 值设置为从数据库获取的 Int ,但由于get_data不是列,因此无法比较。反正有没有让这个工作?

标签: apache-sparkpysparkapache-spark-sqlregexp-replace

解决方案


试着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
            )
        )
    )
)

推荐阅读