如何在PySpark中嵌套使用split(),提取目标字符串片段?
解决PySpark中嵌套split提取字符串片段的问题
你的代码返回空数组的核心原因是PySpark的split函数第二个参数是正则表达式——.在正则中是通配符,匹配任意单个字符,用它拆分相当于把每个字符都拆成独立元素,自然得不到想要的结果。必须把.转义成\\.(Python字符串中需要双重转义)。
方案一:修正嵌套split代码
针对你的需求,提取下划线前后的000片段,修正后的嵌套split代码如下:
- 提取下划线前的最后三位数字(即
_前的000):
splitDF = df.withColumn("fn_prefix_three", split(split(df["fn"], "_").getItem(0), "-").getItem(6))
(注:这其实和你之前提取的fn_milli是同一个值,如果你已经有fn_milli字段,直接复用即可)
- 提取下划线后的三位数字(即
_和.之间的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
相关产品推荐
相关产品推荐

