You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PySpark中嵌套使用split(),提取目标字符串片段?

解决PySpark中嵌套split提取字符串片段的问题

你的代码返回空数组的核心原因是PySpark的split函数第二个参数是正则表达式——.在正则中是通配符,匹配任意单个字符,用它拆分相当于把每个字符都拆成独立元素,自然得不到想要的结果。必须把.转义成\\.(Python字符串中需要双重转义)。

方案一:修正嵌套split代码

针对你的需求,提取下划线前后的000片段,修正后的嵌套split代码如下:

  1. 提取下划线前的最后三位数字(即_前的000):
splitDF = df.withColumn("fn_prefix_three", split(split(df["fn"], "_").getItem(0), "-").getItem(6))

(注:这其实和你之前提取的fn_milli是同一个值,如果你已经有fn_milli字段,直接复用即可)

  1. 提取下划线后的三位数字(即_和.之间的000):
splitDF = splitDF.withColumn("fn_suffix_three", split(split(df["fn"], "_").getItem(1), "\\.").getItem(0))

方案二:用正则提取更高效

因为你的字符串格式固定,用regexp_extract可以一步到位,避免多次split的冗余操作:

from pyspark.sql.functions import regexp_extract

splitDF = (df
           # 提取下划线前的最后三位数字
           .withColumn("fn_prefix_three", regexp_extract(df["fn"], r"-(\d{3})_", 1))
           # 提取下划线和点之间的三位数字
           .withColumn("fn_suffix_three", regexp_extract(df["fn"], r"_(\d{3})\.([a-z]+)", 1))
           # 保留你之前提取的时间字段
           .withColumn("fn_year", split(df["fn"], "-").getItem(0))
           .withColumn("fn_month", split(df["fn"], "-").getItem(1))
           .withColumn("fn_day", split(df["fn"], "-").getItem(2))
           .withColumn("fn_hour", split(df["fn"], "-").getItem(3))
           .withColumn("fn_min", split(df["fn"], "-").getItem(4))
           .withColumn("fn_sec", split(df["fn"], "-").getItem(5))
           .withColumn("fn_milli", split(df["fn"], "-").getItem(6))
          )

正则表达式说明:

  • r"-(\d{3})_":匹配-后、_前的三位数字,括号内为捕获组,用1提取
  • r"_(\d{3})\.([a-z]+)":匹配_后、.前的三位数字,同样用捕获组提取

内容的提问来源于stack exchange,提问作者Canislupus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 20:20:54