如何在PySpark中通过模式匹配基于现有列生成新派生列
PySpark 派生列实现方案
核心逻辑按优先级匹配规则,全程使用PySpark内置函数实现,不需要自定义UDF,性能适配大规模数据场景。
实现步骤
- 第一步:定义匹配优先级规则
- 优先匹配完整的
Web Audio/Mobile Audio字符串,匹配成功直接返回对应值 - 未匹配到全称时,匹配独立出现的缩写
WA/MA,映射为对应全称 - 未匹配到以上两类内容时,提取字符串首个分隔符(横杠、下划线、空格)前的有效内容
- 优先匹配完整的
- 第二步:代码实现
from pyspark.sql import functions as F # 定义匹配规则 # 匹配独立出现的全名字符串,避免误匹配到其他单词内部的对应字符 has_web_audio = F.col("col1").rlike(r"(?:^|[_ \-])Web Audio(?:$|[_ \-])") has_mobile_audio = F.col("col1").rlike(r"(?:^|[_ \-])Mobile Audio(?:$|[_ \-])") # 匹配独立出现的缩写,避免误匹配(如WAVE不会被识别为WA) has_wa = F.col("col1").rlike(r"(?:^|[_ \-])WA(?:$|[_ \-])") has_ma = F.col("col1").rlike(r"(?:^|[_ \-])MA(?:$|[_ \-])") # 非音频类场景处理:按横杠/下划线切分取第一部分,去除首尾空格 other_case = F.trim(F.split(F.col("col1"), r"[-_]")[0]) # 生成派生列 df = df.withColumn( "derived_col1", F.when(has_web_audio, "Web Audio") .when(has_mobile_audio, "Mobile Audio") .when(has_wa, "Web Audio") .when(has_ma, "Mobile Audio") .otherwise(other_case) )
- 第三步:规则扩展
如果后续新增其他匹配规则,直接在when调用链的对应优先级位置新增条件即可,无需改动原有逻辑。
内容的提问来源于stack exchange,提问作者Srinivas
相关产品推荐
相关产品推荐

