PySpark如何用regexp_extract简化斜杠分隔字段提取逻辑
使用regexp_extract简化斜杠分隔字段提取
你原来嵌套多层substring_index的写法可以通过正则捕获组大幅简化,不需要额外写when...otherwise分支做格式判断,regexp_extract匹配不到目标内容时会默认返回空字符串,和你原有逻辑的输出规则完全对齐。
实现逻辑
待处理字符串固定以T- 为前缀,后续跟随3段由/分隔的目标值,直接用带3个捕获组的正则匹配整段字符串即可:
- 正则规则:
^T-\s*([^/]+)/([^/]+)/([^/]+)$ - 第1个捕获组匹配
T-后到第一个/之间的内容,对应ACode - 第2个捕获组匹配两个
/之间的内容,对应BCode - 第3个捕获组匹配最后一个
/到字符串末尾的内容,对应CCode - 正则中
\s*可以自动适配T-后任意数量的空白字符,比原来硬编码匹配固定空格的写法兼容性更好
具体代码
# 定义统一提取正则 field_extract_re = r'^T-\s*([^/]+)/([^/]+)/([^/]+)$' result_df = source_df.withColumn("ACode", regexp_extract(col("column1"), field_extract_re, 1)) \ .withColumn("BCode", regexp_extract(col("column1"), field_extract_re, 2)) \ .withColumn("CCode", regexp_extract(col("column1"), field_extract_re, 3))
提取结果验证
针对你给出的示例值,提取结果完全符合预期:
| column1 | ACode | BCode | CCode |
|---|---|---|---|
| T- 41231/REGULAR/041293 | 41231 | REGULAR | 041293 |
内容的提问来源于stack exchange,提问作者coding
相关产品推荐
相关产品推荐

