PySpark提取路径字符串最后斜杠后完整内容的实现方法
PySpark提取路径字符串末段内容的修正方案
现有实现的偏差原因
原有提取逻辑的核心问题是选错了匹配锚点:
- 写的正则
_(.*)会捕获字符串中第一个出现的下划线之后的所有内容 - 待提取的路径末段本身包含大量下划线(如
fsp_store_xxx中fsp和store之间的下划线),这种匹配会从内容内部的第一个下划线处直接截断,最终丢失了末段开头的fsp_前缀,和预期结果不符。
可行的修正方式
路径类字符串的天然分隔符是/,只需提取最后一个斜杠之后的所有内容即可,完全不需要以下划线作为匹配锚点,两种常用实现都可以得到符合要求的结果:
方式1:修正正则匹配规则
将正则替换为/([^/]*)$,该规则的逻辑是:
- 定位字符串末尾位置前最后一个斜杠
- 捕获该斜杠之后、直到字符串结束的所有非斜杠字符
调整后的核心代码为:
from pyspark.sql.functions import * df = spark.sql("""select stack(2, "/dbfs/mnt/abc/date=20210224/fsp_store_abcxyz_lmn_", "/dbfs/mnt/abc/date=20210224/fsp_store_schu_lev_bsd_s_" ) as (txt)""") df.withColumn( "extract", regexp_extract(col("txt"), "/([^/]*)$", 1) ).display(10, False)
方式2:用字符串拆分实现(更易维护)
直接按斜杠拆分字符串,取拆分后数组的最后一个元素,逻辑更直观,不容易踩正则匹配的坑:
from pyspark.sql.functions import split, element_at df.withColumn( "extract", element_at(split(col("txt"), "/"), -1) ).display(10, False)
这里的element_at函数支持数组的负索引取值,传入-1即可直接拿到数组的最后一个元素,不需要额外计算数组长度做索引偏移。
内容的提问来源于stack exchange,提问作者batman_special
相关产品推荐
相关产品推荐

