基于另一DataFrame替换指定值为0、其余值为1的实现需求
解决方案
在Databricks中可以通过Spark的正则替换函数实现需求,步骤如下:
- 提取匹配目标:从
df2中收集需要替换为0的ids列表,构建正则匹配模式(确保精确匹配完整的id,避免误匹配子串)。 - 两次正则替换:先将匹配到的目标id替换为0,再将剩余的字母数字类元素替换为1,同时保留原有的分隔符、符号及NULL值。
代码实现(Python)
from pyspark.sql import functions as F import re # 从df2中获取需要替换的ids列表 ids_list = [row.ids for row in df2.collect()] # 构建正则匹配模式,转义特殊字符确保精确匹配 pattern = r'\b(' + '|'.join(re.escape(id) for id in ids_list) + r')\b' # 处理df1的name列 df_result = df1.withColumn( "name", F.when( F.col("name").isNull(), F.col("name") # 保留NULL值 ).otherwise( # 第一步:匹配目标ids替换为0 F.regexp_replace( # 第二步:剩余字母数字元素替换为1 F.regexp_replace(F.col("name"), pattern, "0"), r'\b[a-zA-Z0-9]+\b', "1" ) ) ) # 查看结果 df_result.show(truncate=False)
代码说明
re.escape(id):对每个id进行转义,避免ids中包含正则特殊字符(如.+*)时导致匹配异常。- 第一次
regexp_replace:精准匹配df2中的ids,替换为0。 - 第二次
regexp_replace:匹配所有独立的字母数字组合(未被替换的元素),替换为1。 F.when:判断name是否为NULL,保留原始NULL值不做处理。
验证结果
运行后得到的df_result与预期输出完全一致:
id name 1 1/1/0 2 0/1/1 3 0+1 4 1/1/0+0+1; 5 1+-0/+0+1; 6 ; 7 NULL
内容的提问来源于stack exchange,提问作者user1702932
相关产品推荐
相关产品推荐

