如何在 PySpark 中编写条件正则表达式替换?
How can I write conditional regex replace in PySpark?
我试图让 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
不是列。无论如何让这个工作?
尝试将 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
)
)
)
)
我试图让 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
不是列。无论如何让这个工作?
尝试将 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
)
)
)
)